2012-06-08 140 views
1

我在每個季度上個月的第一個日期安排工作時遇到問題。 這將是很容易的,因爲我可以得到每季度的最後一個月,然後第一次約會追加到它像按季度計算日期

select START_DATE, 
CONVERT(datetime,CAST(YEAR(START_DATE) as VARCHAR(4))+'/'+ 
       CAST(DATEPART(Q,START_DATE)*3 as VARCHAR(2))+'/01 00:00:00',120 
     ) as SCHEDULE_DATE_LAST_MONTH_OF_QUARTER 
from JOB_SCHEDULE_CONFIGURATION 

的絆腳石是START_DATE。我會用一個例子

START_DATE SCHEDULE_DATE_LAST_MONTH_OF_QUARTER 
2012/05/01 2012/06/01 --correct schedule 
2012/02/15 2012/03/01 --correct schedule 
2012/06/15 2012/06/01 ---problem at this line I will explain why 

的開始日期恰好是2012/06/15說明,我不能在開始之前的計劃作業,即2012/06/01。我必須在2012/06/15之後安排它,這意味着工作應該安排在下一個季度,即2012/09/01

查詢應該如何修改?我認爲可能會涉及一些數學,我真的不擅長數學。 請幫忙。

感謝

大衛

回答

2
declare @T table 
(
    START_DATE date 
) 

insert into @T values 
('2012-05-01'), 
('2012-02-15'), 
('2012-06-15') 

select dateadd(month, 
       2, 
       dateadd(quarter, 
         datediff(quarter, 
           0, 
           dateadd(month, 
             case when day(START_DATE) >= 15 
              then 1 
              else 0 
             end, 
             START_DATE)), 
         0)) 
from @T 

更新:

該查詢的主要部分是得到一個季度的第一日期和由DATEADD所做/ DATEDIFF伎倆。

select dateadd(quarter, datedifF(quarter, 0, START_DATE), 0) 
from @T 

結果:

----------------------- 
2012-04-01 00:00:00.000 
2012-01-01 00:00:00.000 
2012-04-01 00:00:00.000 

你想要的季度的最後一個月,所以我們增加一個dateadd(month, 2

select dateadd(month, 2, dateadd(quarter, datedifF(quarter, 0, START_DATE), 0)) 
from @T 

結果:

----------------------- 
2012-06-01 00:00:00.000 
2012-03-01 00:00:00.000 
2012-06-01 00:00:00.000 

這使得只有部分日期很晚比上個月的15日應該在下個季度末。 day(START_DATE)會給你一個月的一天,所以如果day(START_DATE) >= 15使用case語句,我們可以在START_DATE添加1個月。

select dateadd(month, case when day(START_DATE) >= 15 then 1 else 0 end, START_DATE) 
from @T 

結果:

---------- 
2012-05-01 
2012-03-15 
2012-07-15 

全部放在一起就這個樣子。

select dateadd(month, 2, dateadd(quarter, datedifF(quarter, 0, dateadd(month, case when day(START_DATE) >= 15 then 1 else 0 end, START_DATE)), 0)) 
from @T 

結果:

----------------------- 
2012-06-01 00:00:00.000 
2012-03-01 00:00:00.000 
2012-09-01 00:00:00.000 
+0

能否請您解釋查詢背後的邏輯。謝謝PS START_DATE可以是從1日到31日的任何日期。它不一定是15. –

+0

@davidmichell - 當然,我已經更新了答案。 –

+0

感謝Mikael。得到它了。超。感謝您的查詢和詳細的解釋 –