2014-12-04 83 views
0

我正在嘗試獲取簡單報告的開始年份/月份和結束年份/月份。在我的存儲過程中,我有以下內容:MONTH(GetDate())SQL Server 2008 R2返回錯誤的月份

IF @parm_StartYear is null SET @parm_StartYear = CONVERT(VARCHAR(4), DATEPART(YYYY,DATEADD(YYYY, -1, GETDATE()))); 
IF @parm_StartMonth is null SET @parm_StartMonth = CONVERT(VARCHAR(2),DATEPART(MM,MONTH(GETDATE()))); 
IF @parm_EndYear is null SET @parm_EndYear = CONVERT(VARCHAR(4),DATEPART(YYYY,GETDATE())); 
IF @parm_EndMonth is null SET @parm_EndMonth = CONVERT(VARCHAR(2),DATEPART(MM,MONTH(GETDATE()))); 

年份是正確的,但該月份是未來一個月。 IE瀏覽器。今天是十二月(12),但它將在一月(01)迴歸。

我是否錯過了簡單的東西或者做了什麼錯誤的事情?我看到的每個示例和其他問題都或多或少地顯示了這個確切的代碼。

回答

0

不要投getdate()到月 - 所以此工程:

IF @parm_EndMonth is null SET @parm_EndMonth = CONVERT(CHAR(2),DATEPART(MM,GETDATE())); 
+0

OMG。很簡單,謝謝。我在這個哈哈上浪費了幾個小時。乾杯! – rookie68 2014-12-04 16:31:21

+1

MONTH()'調用不是一個強制轉換:這是一個函數調用 – 2014-12-04 16:34:03

+0

出於某種原因,我認爲我需要Month()調用來獲取要轉換的日期的月份部分。我迷惑自己。 – rookie68 2014-12-04 16:36:24

0

這種表達是沒有意義的:

CONVERT(VARCHAR(2),DATEPART(MM,MONTH(GETDATE()))); 

當你調用MONTH(GETDATE()),你已經有一個整數結果。您不使用整數上的DATEPART()函數。一開始我很驚訝這不會產生錯誤,直到我記得Sql Server在內部以數字格式存儲日期。然後我意識到這個表達式會返回自Sql Server時代以來的第12天的結果,在這種情況下:1900年1月13日。這解釋了您的1結果。你可以看到它,如果你嘗試這種說法在查詢窗口:

SELECT cast(12 as datetime) 

您真正需要的是這樣的:

CONVERT(VARCHAR(2),MONTH(GETDATE())) 

我也想知道,爲什麼你在這裏尋找字符結果所有。如果你想不同的領域,我真的只是不停的用整數,並讓客戶端代碼擔心使它成爲一個字符串:

MONTH(GETDATE()) 

與包括parm令牌的變量名,我很擔心你的傳球這到另一個程序,正在做一些非常可怕的事情與字符串作爲日期,當它應該只與DateTime值。 OMG。