2017-03-28 3 views
1

私は開始年と終了年を設定して隔週の日付を生成しようとしています。 2017年3月15日および2017年3月30日が給料日です:SQL Serverで1年間に隔月の日付を取得するにはどうすればよいですか?

DECLARE @StartYear DATETIME 
DECLARE @EndYear DATETIME 

SET @StartYear = '01/01/2017' 
SET @EndYear = '12/31/2017' 

T-SQLはその後隔週日付、例を計算する必要があります。

また、日付が土曜日と日曜日の場合は、第1金曜日までの日付が生成されます。

誰かがこれを手伝ってくれることを願っています。または、誰かがこれに関する知識と数式を共有したいと考えています。

UPDATE:私の期待される結果を次のように

を私は2017年1月1日を入力すると、それが自動的にすべての15日発生します。

例:

@StartYear: 01/01/2017 

結果は次のようになります。

DatesBiweeklyPerMonthInAYear 
------------------------------- 
01/13/2017 (since the 15th day falls on sunday) 
01/30/2017 
02/15/2017 
02/28/2017 (since no 30th day) 

15日は日に当たるか、その特定の週の金曜日に分類されます座っている場合。 など...年末まで。

これは達成可能ですか?か否か?

ありがとうございます!

+0

変数を宣言して値を設定することは、今まで行ってきたことですか? – Ahsan

+0

SQL Agemtを使用して作業スケジュール –

+0

@Ahsan、はい、実際には、隔週の給料期間を1年間設定する方法についていくつかの調査を行っていたためです。これまでのところ、このリンクには良い説明があります:http://stackoverflow.com/questions/35561224/sql-server-calculate-bi-weekly-pay-period-dates、しかし、それは1年ごとの毎週のmondayに焦点を当てます。私はここで目標を設定しようとしています。なぜなら、その給与期間を生み出すというビジネスポリシーが、ある年の1月に15日と30日を得るためです。 –

答えて

1

ビジネスルールは100%明確ではありません。

私は複数の正しい結果があると思います。

私は100%の要件を確実にしたいので、ハードコーディングされています。 私はカーソルを使用していません。わずか24ループです。

declare @StartYear datetime='2017-01-01' 
declare @endYear datetime ='2017-12-31' 

declare @gap int =14 --Bimonthly means gap of 14 days or 15 days whatever 

;With CTE as 
(
select dateadd(day,@gap, @StartYear) Bimonthly 
,1 rn 

UNION ALL 

select 
case 

when (rn+1)%2=0 and datename(m, Bimonthly)='February' THEN 
     '2017-02-28' 
     when (rn+1)%2=0 and datename(m, Bimonthly)!='February' 

then dateadd(day,@gap, Bimonthly) 
else 
dateadd(day,@gap, dateadd(month, datediff(month,0,dateadd(month,1,Bimonthly)),0)) 
END 
,rn+1 
from cte 
where rn< (datediff(month,@StartYear, @endYear)+1)*2 

) 
select 
case WHEN datename(dw, Bimonthly)='Saturday' THEN 
     dateadd(day,-1, Bimonthly) 
     WHEN datename(dw, Bimonthly)='Sunday' THEN 
     dateadd(day,-2, Bimonthly) 
    else 
     Bimonthly 
    end 

    ,rn 

from cte 
2

ここがスタートです。あなたは希望の結果を得るためにロジックを微調整する必要があります。

DECLARE @MinDate DATE = '20170101', 
     @MaxDate DATE = '20171231'; 
DECLARE @date DATE; 
DECLARE @counter INT = 0; 
DECLARE my_cursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR 
    SELECT TOP (Datediff(day, @MinDate, @MaxDate) + 1) Date = 
    Dateadd(day, Row_number() 
       OVER( 
        ORDER 
    BY a.object_id) - 1, @MinDate) 
    FROM sys.all_objects a 
     CROSS JOIN sys.all_objects b; 

OPEN my_cursor 

FETCH next FROM my_cursor INTO @date 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF(@counter = 15) 
     BEGIN 
      PRINT @date -- here is where you get the 15th date 
      SET @counter = 0 
     END 
     SET @counter = @counter + 1 
     FETCH next FROM my_cursor INTO @date 
    END 

CLOSE my_cursor 

DEALLOCATE my_cursor 
+0

これは私が探しているものです。ありがとう! –

関連する問題