2014-02-26 51 views
0

我在以下情況下處理日期操作。查找在給定範圍內的日期

輸入:DateA,DateB,MONTH_COUNT

前提條件:DateB總是比DateA

Output: 
1)I need to find newstartdate and newEndDate from DateB 
newStartDate<DateA<newEndDate. 
2)For newstartDate ,dateB is subtracted by month count . 
3)NewEndDate is newStartDate+month_count. 
4)Repeat 2,3 until the condition 1 becomes true. 

我想出了while條件進行this.Is有什麼辦法可以更大簡化這個邏輯?

Declare @dateA datetime 
    Declare @dateB Datetime 
    declare @month_count int 
    declare @newstartdate datetime 
    declare @newenddate datetime 

    set @dateA= '2013-02-21' 
    set @dateB='2013-08-23' 
    set @month_count=3 

    SET @newstartdate=DATEADD(mm,[email protected]_count,@dateB) 
    Set @newenddate=DATEADD(mm,@month_count ,@newstartdate) 

    WHILE Not (@newstartdate < @dateA AND @dateA<@newenddate) 
    BEGIN 
    SET @newstartdate=DATEADD(mm,[email protected]_count,@newstartdate) 
    Set @newenddate=DATEADD(mm,@month_count,@newstartdate) 
    Select @dateA 'DateA',@newstartdate '@newstartdate',@newenddate '@newenddate' 
    END 
+0

一個完整側面說明,我會建議總是寫日期作爲格式'YYYY-MM-DD'字符串因爲這將消除任何文化問題 – freefaller

+0

感謝.Modified相同 – Krishna

回答

0

取決於你的意思是簡單的。

我在想如何用遞歸CTE來做到這一點,但Johan先到那裏。這可能是正確的做法。

然而,它不一定像你所擁有的那樣「簡單」。你可以進一步簡化一點。

順便說一句,我還建議在你如何在你的SQL和你的變量中使用大寫字母變得一致。無論您選擇哪種風格,如果它至少在內部保持一致,則它更易於閱讀並且看起來「更好」。

Declare @dateA datetime 
Declare @dateB Datetime 
declare @month_count int 
declare @newstartdate datetime 
declare @newenddate datetime 

set @dateA= '2013-02-21' 
set @dateB='2013-08-23' 
set @month_count=3 

Set @[email protected] 
SET @newstartdate=DATEADD(mm,[email protected]_count,@dateB) 

WHILE Not (@newstartdate < @dateA AND @dateA<@newenddate) BEGIN 
    Set @[email protected] 
    SET @newstartdate=DATEADD(mm,[email protected]_count,@newstartdate)  
END 
--do you need to select the interimediate results or simply the final? 
Select @dateA 'DateA',@newstartdate '@newstartdate',@newenddate '@newenddate' 
1

也許這樣的事情有幫助嗎?

declare @dateA datetime = '2013-02-21' 
declare @dateB datetime = '2013-08-23' 
declare @month_count int = 3 

;with dates(newstartdate, newenddate) 
as 
(
    SELECT DATEADD(month, [email protected]_count, @dateB) 
      ,@dateB 
    UNION ALL 
    SELECT DATEADD(month, [email protected]_count, newstartdate) 
      ,newstartdate 
    FROM dates 
    WHERE newstartdate > @dateA 
) 
SELECT TOP 1 * 
FROM dates 
ORDER BY newstartdate 
+0

入門預期results.Will是將這些邏輯合併爲一個查詢很有用。我將不得不檢查哪一個編碼容易處理這兩個選項(cte或while循環編碼)。 – Krishna

相關問題