渡された日付が土曜日または日曜日のみの場合、日付を月曜日に移動する関数を TSQL で作成する必要があります。
例えば:
- 5/6/2012 は 5/7/2012 を返す必要があります
- 5/12/2012 は 5/14/2012 を返す必要があります
日付が土曜日または日曜日でない場合は、入力された日付を返します
渡された日付が土曜日または日曜日のみの場合、日付を月曜日に移動する関数を TSQL で作成する必要があります。
例えば:
日付が土曜日または日曜日でない場合は、入力された日付を返します
これにより、日付が土曜日または日曜日の場合、次の月曜日が得られます。それ以外の場合は、指定した日付が表示されます。
DECLARE @Date DATETIME; SET @Date = GETDATE();
SELECT
CASE (@@DATEFIRST + DATEPART(dw, @Date)) % 7
WHEN 0 THEN DATEADD(day, 2, @Date) -- Saturday
WHEN 1 THEN DATEADD(day, 1, @Date) -- Sunday
ELSE @Date
END AS Weekday
EDIT : @@DATEFIRST の問題に対するConrad Frix のソリューションが含まれています。
SET DATEFIRSTオプションに応じて(米国英語のデフォルトは 7、日曜日 = 1):
CASE
WHEN DATEPART(weekday, @dt) = 1 -- Sunday
THEN DATEADD(day, 1, @dt)
WHEN DATEPART(weekday, @dt) = 7 -- Saturday
THEN DATEADD(day, 2, @dt)
ELSE
@dt
END
依存しないバージョンset datefirst
select dateadd(day,
case datediff(day, '17530101', @D) % 7
when 5 then 2
when 6 then 1
else 0
end,
@D)
同じことがおそらくよりきれいです。
select case datediff(day, '17530101', @D) % 7
when 5 then dateadd(day, 2, @D)
when 6 then dateadd(day, 1, @D)
else @D
end
定数17530101
は月曜日で、 で機能しdatetime
ます。使用している場合は、代わりにdate
使用できます00010101
。
これはどう:
SELECT CASE datepart(dw, @date) WHEN 7 THEN @date + 2 WHEN 1 THEN @date + 1 ELSE @date END
これでうまくいくはずです。基本的に土曜日に 2 日、または日曜日に 1 日を追加して、サンプル日を月曜日に移動します。
DECLARE @Temp TABLE
(
dtSample DATETIME
)
INSERT INTO @Temp VALUES ('5/1/2012')
INSERT INTO @Temp VALUES ('5/2/2012')
INSERT INTO @Temp VALUES ('5/3/2012')
INSERT INTO @Temp VALUES ('5/4/2012')
INSERT INTO @Temp VALUES ('5/5/2012')
INSERT INTO @Temp VALUES ('5/6/2012')
INSERT INTO @Temp VALUES ('5/7/2012')
INSERT INTO @Temp VALUES ('5/8/2012')
INSERT INTO @Temp VALUES ('5/9/2012')
INSERT INTO @Temp VALUES ('5/10/2012')
INSERT INTO @Temp VALUES ('5/11/2012')
INSERT INTO @Temp VALUES ('5/12/2012')
INSERT INTO @Temp VALUES ('5/13/2012')
INSERT INTO @Temp VALUES ('5/14/2012')
SELECT
dtSample
,CASE WHEN DATEPART(WEEKDAY, dtSample) = 7
THEN dtSample + 2
ELSE
CASE WHEN DATEPART(WEEKDAY, dtSample) = 1
THEN dtSample + 1
ELSE dtSample
END
END AS dtConverted
FROM @Temp
結果:
dtSample dtConverted
2012-05-01 00:00:00.000 2012-05-01 00:00:00.000
2012-05-02 00:00:00.000 2012-05-02 00:00:00.000
2012-05-03 00:00:00.000 2012-05-03 00:00:00.000
2012-05-04 00:00:00.000 2012-05-04 00:00:00.000
2012-05-05 00:00:00.000 2012-05-07 00:00:00.000
2012-05-06 00:00:00.000 2012-05-07 00:00:00.000
2012-05-07 00:00:00.000 2012-05-07 00:00:00.000
2012-05-08 00:00:00.000 2012-05-08 00:00:00.000
2012-05-09 00:00:00.000 2012-05-09 00:00:00.000
2012-05-10 00:00:00.000 2012-05-10 00:00:00.000
2012-05-11 00:00:00.000 2012-05-11 00:00:00.000
2012-05-12 00:00:00.000 2012-05-14 00:00:00.000
2012-05-13 00:00:00.000 2012-05-14 00:00:00.000
2012-05-14 00:00:00.000 2012-05-14 00:00:00.000
と の組み合わせを使用しDATEPART
ますDATEADD
。
select date
, CASE DATEPART(weekday, date)
WHEN 6 THEN DATEADD(day, 2, date) -- Saturday
WHEN 7 THEN DATEADD(day, 1, date) -- Sunday
ELSE date
END AS NewDate
from @dates
order by date
サンプルデータ:
declare @dates table(date datetime);
insert into @dates values('20120401');
insert into @dates values('20120402');
insert into @dates values('20120403');
insert into @dates values('20120404');
insert into @dates values('20120405');
insert into @dates values('20120406');
insert into @dates values('20120407');
insert into @dates values('20120408');
insert into @dates values('20120409');
insert into @dates values('20120410');
結果:
date NewDate
2012-04-01 00:00:00.000 2012-04-02 00:00:00.000
2012-04-02 00:00:00.000 2012-04-02 00:00:00.000
2012-04-03 00:00:00.000 2012-04-03 00:00:00.000
2012-04-04 00:00:00.000 2012-04-04 00:00:00.000
2012-04-05 00:00:00.000 2012-04-05 00:00:00.000
2012-04-06 00:00:00.000 2012-04-06 00:00:00.000
2012-04-07 00:00:00.000 2012-04-09 00:00:00.000
2012-04-08 00:00:00.000 2012-04-09 00:00:00.000
2012-04-09 00:00:00.000 2012-04-09 00:00:00.000
2012-04-10 00:00:00.000 2012-04-10 00:00:00.000
5 月 8 日に zimdanen によって提供されたソリューションを拡張しました。開始日が金曜日だったときは失敗しました。
DECLARE @FromDate DATETIME
BEGIN
SET @FromDate='04/07/2014'
SELECT
@FromDate as [StartDate]
, CASE (@@DATEFIRST + DATEPART(dw, (DATEADD(DD,3,@FromDate)))) % 7
WHEN 0 THEN DATEADD(day, 2, (DATEADD(DD,3,@FromDate))) -- Saturday
WHEN 1 THEN
CASE
WHEN DATEPART(dw,@FromDate)=5 Then DATEADD(DD,5,@FromDate) -- Thursday
ELSE DATEADD(day, 1, (DATEADD(DD,3,@FromDate))) -- Sunday
END
ELSE
CASE
WHEN DATEPART(dw,@FromDate)=6 Then DATEADD(DD,5,@FromDate) -- Friday
ELSE DATEADD(DD,3,@FromDate)
END
END AS Weekday
END