は私がTetonSigに感謝し、このリンクに彼の参照思い付いたものです@AsOfDate)そうのように:
SELECT DATEADD(day, DATEDIFF(day,0, @AsOfDate-1) /7*7, 0);
これは、日中に1900年1月1日と@AsOfDate間の日数を取得します。/7 * 7はそれを週全体に変換し、1900年1月1日(月)に戻して@AsOfDateの前の月曜日を取得します。 -1は@AsOfDateを排除します。マイナス1がなければ、@ AsOfDateが月曜日にあった場合、それは「前の」月曜日とみなされます。
次の著者は包括次月曜日取得することを示し、我々は単に排他以前の月曜日の式に7を追加する必要があります。
SELECT DATEADD(d, DATEDIFF(day,0, @AsOfDate-1) /7*7, 0)+7;
出来上がり!私たちは@AsOfDate以降の最初の月曜日を取得しました。唯一の問題は、上記の月曜日(0)が私の場合の動くターゲットだということです。最初の月曜日ではなく、クラスの日付で決められた最初の[DayOfWeek]が必要です。私は上記の0のためClassDayOfWeek計算をスワップアウトする必要があります。
DATEADD(d, DATEDIFF(d, [ClassDayOfWeek], @AsOfDate-1)/7*7, [ClassDayOfWeek])+7
私はに依存しているかDATEFIRST @@設定で混乱することなく、ClassDayOfWeekを計算したかったです。だから私は、基準日からの相対それを計算:
DATEDIFF(d, 0, StartDate)%7
これは、私たちが今[ClassDayOfWeek]のためにそれをプラグインすることができます日のために月、6 0を与えます。この0〜6の値は、1/1/1900-1/7/1900がintとして表される日付であることを指摘しておきます。
DATEADD(d, DATEDIFF(d, DATEDIFF(d, 0, StartDate)%7, @AsOfDate-1)/7*7, DATEDIFF(d, 0, StartDate)%7)+7
、問題ごとの使用中:
SELECT *
FROM tbl_Class cs
INNER JOIN tbl_Enrollment sce ON cs.pk_ClassID = sce.fk_ClassID
WHERE ...
AND sce.StartDate < DATEADD(d,
DATEDIFF(d,
DATEDIFF(d, 0, cs.StartDate)%7,
@AsOfDate-1)/7*7,
DATEDIFF(d, 0, cs.StartDate)%7)+7
'DATEPART(WEEKDAY'は(http://stackoverflow.com/a/5984859/73226) –
マイ米国/英語中心ネスストライキ再び!おかげで、マーティン[@@ DATEFIRST''に依存しています] – TetonSig
私は同じことを指摘するつもりでしたが、2の減算は@@ datefirstが7に設定されていることを前提としています。 @@ datefirstへの依存をなくし、条件文を必要としない別の解決策を見つけたと思います。ご利用いただきありがとうございます。 – xr280xr