2011-12-02 74 views
0

我有以下一段代碼,它會在我指定的日期前1個月給出日期。例如,如果我想獲得1個月的日期之前11年11月30日下面的代碼會給2011/10/31SQL日期CONVERT

select CONVERT(DATETIME, DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'11-30-11'),0)), 102) 

的如何修改上面的代碼的結果,這樣它會在我指定的日期前兩個月返回日期,因此如果我在代碼中指定'11 -30-11',它將返回2011/09/30?

我真的不明白上面的代碼是如何工作的?我嘗試將-1改爲-2,但只減1天和1個月,因此它將返回2011/10/30而不是10/31。我需要它返回2011/09/30,比代碼(11-30-11)中的日期少2個月。

+0

前1個月11月30日是10月30日。你想要「前n個月結束」? – gbn

+0

正是我想讓它返回上個月的最後一天。所以上面的代碼工作正常。它返回2011年10月31日,但我現在需要它返回提前2個月的最後一天,然後返回代碼中指定的日期。它應該返回9/30/2011 –

+0

完美的工作。謝謝! –

回答

3
CONVERT(DATETIME, 
     DATEADD(d,-1, 
      DATEADD(mm, DATEDIFF(m, 32,'20111130'), 0) -- use yyyymmdd and 32 
     ) 
    , 102) 

與0 DATEADD/DATEDIFF比較01一月1900所以改爲32,使其1900年2月1日

另外,你的日期格式是不安全的。使用YYYYMMDD爲SQL Server

,也許簡單的這樣

DATEADD(d, -1, DATEADD(mm, -2, DATEADD(d, 1,'20111130')))