Количество дней в нескольких годах

minya13_85
Дата: 19.02.2013 17:05:33
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)   Sep 21 2011 22:45:45   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 


Клиент выбирает несколько годов. нужно определить кол-во дней, вплоть до сегодняшнего.
DECLARE @Y nvarchar(50)
SET @Y='2008,2010,2013'


т.е. нужно получить на выходе кол-во дней за 2008 год+2010+ 2013 год до сегодняшнего момента..
Glory
Дата: 19.02.2013 17:10:01
количество дней в году - это разница между первой датой года и последней
iap
Дата: 19.02.2013 17:32:56
Glory
количество дней в году - это разница между первой датой года и последней
плюс единица
Или разница между первыми датами года и года, следующего за ним.
iap
Дата: 19.02.2013 17:33:44
Например,
SELECT DATEDIFF(DAY,'2013','2014')
minya13_85
Дата: 19.02.2013 17:44:04
года выбирают не по порядку.. и вводят их текстовым полем через запятую
Т.е. нужно сначала разбить на года, потом в каждом году вычислить период и просуммировать? Или как проще? Годов может быть сколько угодно..
Glory
Дата: 19.02.2013 17:47:36
minya13_85
Т.е. нужно сначала разбить на года, потом в каждом году вычислить период и просуммировать? Или как проще?

Проще иметь сразу таблицу со всеми годами и количеством дней в них
iap
Дата: 19.02.2013 20:05:54
iap
Например,
SELECT DATEDIFF(DAY,'2013','2014')
Забыл - самое короткое выражение для количества дней в году:
SELECT 365+ISDATE('2013'+'0229');
pio777
Дата: 20.02.2013 00:18:57
create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX))       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return 
end;

go

DECLARE @Y nvarchar(50)
SET @Y='2008,2010,2013'
select sum(datediff(dd, cast(items as date), dateadd(yy, 1, cast(items as date))))  from [dbo].[Split](@Y, ',')
iap
Дата: 20.02.2013 09:40:52
DECLARE @Y nvarchar(50)=N'2008,2010,2013';
SELECT SUM(CASE Y WHEN YEAR(CURRENT_TIMESTAMP) THEN DATEPART(DAYOFYEAR,CURRENT_TIMESTAMP) ELSE 365+ISDATE(Y+N'0229') END) [CountOfDays]
FROM
(
 SELECT SUBSTRING(@Y,V.number,
  (
   SELECT MIN(VV.number)
   FROM master.dbo.spt_values VV
   WHERE VV.type='P' AND VV.number BETWEEN V.number AND LEN(@Y)+1
   AND CHARINDEX(SUBSTRING(@Y+N',',VV.number,1),N',')>0
  )-V.number
 )
 FROM master.dbo.spt_values V
 WHERE V.type='P' AND V.number BETWEEN 1 AND LEN(@Y)+1
 AND CHARINDEX(SUBSTRING(N','+@Y,V.number,1),N',')>0
)T(Y);

Функция, которая делит строку на слова
Cygapb-007
Дата: 20.02.2013 10:08:36
DECLARE @Y nvarchar(50)='2008,2010,2013'
--select 366+365+datediff(dd,'20130101',getdate())
select sum(case year(getdate())when x.yr then datediff(dd,x.yr+'0101',getdate()) else 365+isdate(yr + '0229') end)days
from (select cast('<y>'+replace(@y,',','</y><y>')+'</y>' as xml)y)a
cross apply(
  select b.c.value('text()[1]','char(4)')yr
  from a.y.nodes('/y')b(c)
)x