2013-02-28 10 views

回答

1

您的意思是當前服務器時間減一個月?嘗試DATEADD function

dateadd(month, -1, sysdatetime()) 

如果你想選擇在過去的一個月中列的值被記錄,你可以這樣做:

SELECT foo 
FROM bar 
WHERE baz BETWEEN dateadd(month, -1, sysdatetime()) AND sysdatetime() 
+1

不,她的意思是前一個月(例如一月 - 但明天將意味着二月)。 – 2013-02-28 16:55:49

+1

另外,如果您的意思是'MONTH',請輸入'MONTH'。速記可以讓你陷入困境。例如,你認爲'DATEPART(y,GETDATE());'現在返回2013嗎?很多人都這樣做。不要懶惰。 – 2013-02-28 17:05:43

+0

@AaronBertrand關於速記讓你陷入困境的好處,但你怎麼讀到OP的頭腦? – 2013-02-28 17:59:09

3
DECLARE @firstOfLastMonth DATE; 
SET @firstOfLastMonth = DATEADD(MONTH, DATEDIFF(MONTH, 0, SYSDATETIME())-1, 0); 

SELECT ... FROM ... 
WHERE dateColumn >= @firstOfLastMonth 
AND dateColumn < DATEADD(MONTH, 1, @firstOfLastMonth); 

這也是爲什麼你不希望使用BETWEEN此:

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

+0

+1,並且'dateColumn'上的任何索引也將被使用! – 2013-02-28 17:02:52

+0

這工作!!!!!!非常感謝!!!!!! – Carol 2013-02-28 18:03:10