2017-06-23 34 views
0

私には開始日のデータがあります。開始日に従ってサイクルが四半期ごとに実行されます。 (開始日は3/15/15、サイクルは3/15/17、6/15/17、9/15/17などとなります)。私はここでは正しく次の四半期サイクルの計算

when datepart(mm,getdate()) <= datepart(mm, STARTDATE) and datepart(dd,getdate()) < datepart(dd, STARTDATE) then cast(dateadd(mm, (datediff(mm, STARTDATE,getdate())%3), dateadd(mm,datediff(mm, STARTDATE,getdate()),STARTDATE))as date) 

when datepart(mm,getdate()) <= datepart(mm, STARTDATE) and datepart(dd,getdate()) > datepart(dd, STARTDATE) then cast(dateadd(mm, 3-(datediff(mm, STARTDATE,getdate())%3), dateadd(mm,datediff(mm, STARTDATE,getdate()),STARTDATE))as date) 

when datepart(mm,getdate()) >= datepart(mm, STARTDATE) and datepart(dd,getdate()) <= datepart(dd, STARTDATE) then cast(dateadd(mm, 3-(datediff(mm, STARTDATE,getdate())%3), dateadd(mm,datediff(mm, STARTDATE,getdate()),STARTDATE))as date) 

when datepart(mm,getdate()) >= datepart(mm, STARTDATE) and datepart(dd,getdate()) >= datepart(dd, STARTDATE) then cast(dateadd(mm, 3+(datediff(mm, STARTDATE,getdate())%3), dateadd(mm,datediff(mm, STARTDATE,getdate()),STARTDATE))as date) 

これは、次のサイクルの日付を計算するために取得の問題が生じています私の結果は以下のとおりです。いくつかは、いくつかのではなく、正しいです。どんな助けでも大歓迎です。ありがとう!

ID| Start Date| |Next Date| 
1| 3/10/2015| 7/10/2017| 
2| 6/3/2009| 9/3/2017| 
3| 9/28/2014| 6/28/2017| 
4| 9/1/2016| 9/1/2017| 
5| 6/1/2015| 6/1/2018| 
6| 3/15/2017| 7/15/2017| 
7| 3/15/2017| 3/15/2018| 
8| 3/24/2015| 6/24/2017| 
9| 3/1/2016| 3/1/2018| 
10| 9/6/2012| 7/6/2017| 
+0

DATEPARTはあなたのために動作するはず四半期引数(qまたはQQ)を持っています。 –

答えて

0

は、テストデータ設定:

DECLARE @dlist as TABLE(startDate datetime) 
INSERT INTO @dlist VALUES ('1/1/2010'),('2/22/2011'),('4/2/2015'),('11/1/2014'),('9/9/2019') 

は次に、このようなクエリを試してみてください。将来の日付はちょっと面白いので、それが問題になる場合は、いくつかのケースステートメントで回避する必要があります。

SELECT 
    startDate 
    , DATEADD(q, DATEDIFF(q,startDate, GETDATE()) + 1, startDate) as nextDate 
FROM 
    @dlist 

結果:

startDate nextDate 
------------------------ 
2010-01-01 2017-07-01 
2011-02-22 2017-08-22 
2015-04-02 2017-07-02 
2014-11-01 2017-08-01 
2019-09-09 2017-09-09 
関連する問題