2011-09-15 178 views
4
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) 
LastDay_CurrentMonth 

嗨,大家我有查詢查找當前月份的最後一天,這當然運作良好,但我無法理解它,因爲我有其他類似的要求,必須相應地進行更改。查詢當前月份的最後一天的SQL查詢?

有人可以解釋給我.. 預先感謝

+0

這個查詢的哪部分你不明白? – Arvo

+0

參見[蒂博爾Karaszi的最終引導到datetime數據類型:擺脫時間部分的](http://www.karaszi.com/sqlserver/info_datetime.asp#GettingRidOfTimePortion):「的DATEADD/DATEDIFF版本可以很容易地改變,以獲取當前月份,季度或年份的開始...「 – onedaywhen

+2

您顯示的示例有兩種方式存在缺陷。 (1)本月最後一天的*最後一秒*的用法是什麼?如果SMALLDATETIME無論如何都會收起來;如果DATETIME或DATETIME2您將丟失最後一秒發生的一些數據。總是更好地使用> =本月和<下個月。除了Tibor的精彩文章,請參閱http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx(2)迂腐,但SPELL OUT'SECOND'和'MONTH'代替使用's','mm'和'm' ......使得代碼更加自我記錄。 –

回答

16

獲取的日期時間現在

GETDATE() -- 2011-09-15 13:45:00.923 

計算從 '1900-01-01'

在本月的差別
DATEDIFF(m, 0, GETDATE()) -- 1340 

的區別添加到「1900-01-01」加上一個額外的一個月

DATEADD(m, DATEDIFF(m, 0, GETDATE())+1, 0) -- 2011-10-01 00:00:00.000 

刪除1秒

DATEADD(s, -1, DATEADD(m, DATEDIFF(m, 0, GETDATE())+1, 0)) -- 2011-09-30 23:59:59.000 
+3

+1偉大的解釋 - 在[SQL服務器「德納」,這將是更簡單(http://connectsql.blogspot.com/2011/08/sql-server-denali-new-function-to -get.html):'SELECT EOMONTH(GETDATE());':-) –

+2

@marc_s但重要的區別是EOMONTH將在午夜返回最後一天。人們認爲這將使他們的報告查詢變得神奇,但我想如果他們使用「BETWEEN」和/或不相應調整,他們錯過了整整一天的數據(假設是時間組件),我會覺得很多人會感到驚訝。 –

+0

@Aaron Bertrand:啊,好的 - 有趣的信息 - 謝謝!是否會有'EODAY()'函數? :-) –

1

這會給你當月的最後一天,但忽略了時間

選擇EOMONTH(GETDATE())

From Microsoft tech net

+0

EOMONTH()不適用於SQL Server 2008.它是SQL Server 2012的一項新功能。 –

0
CREATE FUNCTION EOMONTH 
(
    @date datetime, 
    @months int 
) 
RETURNS datetime 
AS 
BEGIN 
    declare @eom datetime 
    declare @d datetime 
    set @d = dateadd(MONTH, @months, @date) 
    select @eom = dateadd(SECOND,-1,DATEADD(MONTH,datediff(MONTH,0,@d)+1,0)) 
    RETURN @eom 

END 
GO