16

必要なのは、今日の日付に続く次の日 (月曜日、火曜日、水曜日など) の日付です。

ユーザーは希望する曜日を選択でき、それは int としてテーブルに保存されます。「次の火曜日に電話してください (3)」

Sunday = 1
Monday = 2
Tuesday = 3
...

だから私のテーブルはこのようになります。

UserID, NextDayID

私が思いついたのは次のとおりです。

select dateadd(dd,(7 - datepart(dw,GETDATE()) + NextDayID ) % 7, getdate())

それは機能しているようで、必要に応じて週を追加できる今日の次の日を尋ねると、今日の日付が返されます。

私が疑問に思っているのは、それは良い解決策ですか、それとも私が見逃しているものがありますか?

4

8 に答える 8

39

1) あなたのソリューションは、非決定論的な関数を使用しています: datepart(dw...). このため、設定を変更DATEFIRSTすると異なる結果が得られます。たとえば、次のことを試してください。

SET DATEFIRST 7;
your solution;

その後

SET DATEFIRST 1;
your solution;

DATEFIRST2) 以下のソリューションは/LANGUAGE設定とは無関係です:

DECLARE @NextDayID INT  = 0 -- 0=Mon, 1=Tue, 2 = Wed, ..., 5=Sat, 6=Sun
SELECT DATEADD(DAY, (DATEDIFF(DAY, @NextDayID, GETDATE()) / 7) * 7 + 7, @NextDayID) AS NextDay

結果:

NextDay
-----------------------
2013-09-23 00:00:00.000

DATETIMEこのソリューションは、次のタイプのプロパティに基づいています。

  • 0 日目 = 19000101= 月

  • 1日目 = 19000102= 火

  • 2日目 = 19000103= 水曜日

...

  • 5日目 = 19000106= 土

  • 6日目 = 19000107= 日

したがって、INT 値 0 を DATETIME に変換すると、 が得られ19000101ます。

次を見つけたい場合は、 2 日目 ( / )Wednesdayから開始し、2日目と現在の日 ( ; 41534 日) の間の日数を計算し、7 で割ります (完全な週数を取得するため; 5933 週)、複数7 (41531 fays; 日数 - 最初の /と最後の間の 1 週間)を取得し、7 日 (1 週間; 41538 日; 次を取得するために) を追加します。この数 (41538 日) を開始日に追加します: 。19000103Wed20130921Wednesday19000103WednesdayWednesday19000103

注: 現在の日付は20130921です。

編集#1:

DECLARE @NextDayID INT;
SET @NextDayID = 1; -- Next Sunday
SELECT DATEADD(DAY, (DATEDIFF(DAY, ((@NextDayID + 5) % 7), GETDATE()) / 7) * 7 + 7, ((@NextDayID + 5) % 7)) AS NextDay

結果:

NextDay
-----------------------
2013-09-29 00:00:00.000 

注: 現在の日付は20130923です。

于 2013-09-20T21:26:14.600 に答える