@ラマックは、年の最初の月曜日を考え出しました(upvoted)。私はそうのように、日時の値を取るために彼の日常ビットを改訂:
-- Return first Monday for the year being passed in
CREATE FUNCTION dbo.FirstMonday (@TargetDay datetime)
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE
-- Set to first of its year
SET @TargetDay = dateadd(dd, -datepart(dayofyear, @TargetDay) + 1, @TargetDay)
;WITH Dates AS
(
SELECT @TargetDay AS DateVal
UNION ALL
SELECT DATEADD(d, 1, DateVal) AS DateVal
FROM Dates
WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @TargetDay)
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'
RETURN @Return
END
GO
-- Test it
print dbo.FirstMonday(getdate())
print dbo.FirstMonday('Jan 1, 2010')
そこから、それだけでいくつかのdatetime arithmaticです:あなたが落下年の日を選ぶとき、これが失敗した
DECLARE
@FirstMonday datetime
,@TargetDay datetime
,@BiWeek int
SET @TargetDay = getdate()
--SET @TargetDay = 'Jan 17, 2010'
-- Get the first Monday
SET @FirstMonday = dbo.FirstMonday(@TargetDay)
-- Calculate the bi-weekly period
SET @BiWeek = datediff(dd, @FirstMonday, @TargetDay)/14
-- Print results
PRINT @BiWeek + 1
PRINT dateadd(dd, @BiWeek * 14, @FirstMonday)
PRINT dateadd(dd, @BiWeek * 14 + 13, @FirstMonday)
-- Or return them as a dataset
SELECT
@BiWeek + 1 Period
,dateadd(dd, @BiWeek * 14, @FirstMonday) PeriodStart
,dateadd(dd, @BiWeek * 14 + 13, @FirstMonday) PeriodEnd
の前に最初の月曜日、その日の後の最初の隔週期間が返されます。 (または失敗しますか?あなたはそのような日付に適切な期間が何であるかを指定していませんでした。:)
しかし、@HLGEMによれば、あなたが何をしているかに応じて、隔週期間のルックアップテーブルの場合、特に早期の日付の適切な処理が必要な場合。
使用しているSQL Serverのバージョンは? – Lamak
53週間はどうですか? (すなわち、翌年の最初の月曜日にヒットした2週間の途中です) –
私はSQL Server 2008を使用しています – Yada