-1

これは、以下の SQL に対する私の基準です。

2013 年 1 月 7 日から 2013 年 3 月 18 日まで

1 - 2013 年 1 月 7 日より後の最初の日曜日は 2013 年 1 月 13 日 - 完了 (最初の日曜日) 2 - 2013 年 3 月 18 日より前の最初の日曜日は 2013 年 3 月 17 日 - 完了 (最終日曜日) 3 - 2013 年 1 月 13 日から 2013 年 3 月 17 日までの日数 = 63、 63 を 7 で割る = 9、+1 = 10

したがって、datediff で行う必要があるのは、上記の 1 行目と 2 行目 (最初と最後の日曜日の日付) の結果を使用して、セクション 3 の正しい結果を取得することです。

Declare @From Datetime
Declare @To Datetime

Set @From = '07 Jan 2013'
Set @To = '18 Mar 2013'

Select dateadd(dd, CASE WHEN datepart(weekday, @From) = 1 THEN 0 ELSE 8 - datepart(weekday, @From) END,@From) as FirstSunday, 
dateadd(dd, CASE WHEN datepart(weekday, @To) = 1 THEN 0 ELSE 1 - datepart(weekday, @To) END,@To) as LastSunday

,datediff(d,@From, @To)
4

3 に答える 3

0

私はそれが役立つことを願っています:

Declare @From  Datetime 
Declare @To  Datetime 
Declare @temp  Datetime 
Declare @firstSunday DateTime
Declare @lastSunday DateTime

Set @From = '7 Jan 2013' 
Set @To = '18 Mar 2013'


set @temp = @From
WHILE ( @temp <= @To )
    BEGIN 
        IF DATEPART(dw, @temp) = 1
        BEGIN
            SET @firstSunday = @temp
            BREAK
        END

        set @temp = dateadd(dd,1,@temp)

    END


set @temp = @To
WHILE ( @temp >= @From )
    BEGIN

    IF DATEPART(dw, @temp) = 1
        BEGIN
            SET @lastSunday = @temp
            BREAK
        END

        set @temp = dateadd(dd,-1,@temp)

    END

SELECT @firstSunday, @lastSunday, DATEDIFF(dd,@firstSunday, @lastSunday)/7 +1
于 2013-03-01T10:57:51.277 に答える
0
Declare @From Datetime
Declare @To Datetime

Set @From = '01 Mar 2013'
Set @To = '31 Mar 2013'


SELECT Datediff(Week, dateadd(dd, CASE WHEN datepart(weekday, @From) = 1 THEN 0 ELSE 8 - datepart(weekday, @From) END,@From), 
dateadd(dd, CASE WHEN datepart(weekday, @To) = 1 THEN 0 ELSE 1 - datepart(weekday, @To) END,@To))+1
于 2013-03-01T13:17:48.730 に答える
0

これは以前の回答よりもエレガントですが、読みにくいと思います

フィドルのデモはこちら

declare @From date = '20130107' --'7 Jan 2013' 
declare @To date = '20130318'  --'18 Mar 2013' 

select datediff(day,dateadd(day,wkdays,@from),@to)/7 + 
       case when wkdays = 0 and 
        datename(weekday,dateadd(day,wkdays,@from)) <> 'sunday' then 0 else 1 end 
from (values (0),(1),(2),(3),(4),(5),(6)) t(wkdays)
where dateadd(day,wkdays,@from) between @from and @to
      and datename(weekday,dateadd(day,wkdays,@from)) = 'sunday'
于 2013-03-01T13:42:47.163 に答える