2010-12-31 12 views
0

現在、隔週の期間を計算できるストアドプロシージャを作成しようとしていますが、日付がパラメータとして渡されます。SQL Server。隔週期間を取得するためのストアドプロシージャ

ビジネスロジック:最初の月曜日は隔週の最初の日です。 2010年には例えば

:2010-12-31今日の日付を渡す

period period_start period_end 
    1  2010-01-04 2010-01-17 
    2  2010-01-18 2010-01-31 
    3  2010-02-01 2010-02-14 
    .... 
    26  2010-12-20 2011-01-02 

は26、2010年12月20日および2011年1月2日を返します。これを達成する方法は?

+0

使用しているSQL Serverのバージョンは? – Lamak

+0

53週間はどうですか? (すなわち、翌年の最初の月曜日にヒットした2週間の途中です) –

+0

私はSQL Server 2008を使用しています – Yada

答えて

2

@ラマックは、年の最初の月曜日を考え出しました(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によれば、あなたが何をしているかに応じて、隔週期間のルックアップテーブルの場合、特に早期の日付の適切な処理が必要な場合。

+0

ああ、私はオペラが彼の質問を変えたことに気付かなかった。 + 1あなたのソリューションには、期待どおりに動作します。 – Lamak

+0

うん、その編集は別の質問にしました。 –

1

年の最初の月曜日に取得する関数を作成できます。このような何かはうまくいくはずです:

CREATE FUNCTION dbo.FirstMonday(@Year VARCHAR(4)) 
RETURNS DATE 
AS 
BEGIN 
DECLARE @Return DATE; 

WITH Dates AS 
(
    SELECT CONVERT(DATE,@Year+'0101') AS DateVal 
    UNION ALL 
    SELECT DATEADD(d, 1, DateVal) AS DateVal 
    FROM Dates 
    WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @Year+'0101') 
) 
SELECT @Return = MIN(DateVal) 
FROM Dates 
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday' 

RETURN @Return 
END 
関連する問題