SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
嗨,大家我有查詢查找當前月份的最後一天,這當然運作良好,但我無法理解它,因爲我有其他類似的要求,必須相應地進行更改。查詢當前月份的最後一天的SQL查詢?
有人可以解釋給我.. 預先感謝
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
嗨,大家我有查詢查找當前月份的最後一天,這當然運作良好,但我無法理解它,因爲我有其他類似的要求,必須相應地進行更改。查詢當前月份的最後一天的SQL查詢?
有人可以解釋給我.. 預先感謝
獲取的日期時間現在
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
+1偉大的解釋 - 在[SQL服務器「德納」,這將是更簡單(http://connectsql.blogspot.com/2011/08/sql-server-denali-new-function-to -get.html):'SELECT EOMONTH(GETDATE());':-) –
@marc_s但重要的區別是EOMONTH將在午夜返回最後一天。人們認爲這將使他們的報告查詢變得神奇,但我想如果他們使用「BETWEEN」和/或不相應調整,他們錯過了整整一天的數據(假設是時間組件),我會覺得很多人會感到驚訝。 –
@Aaron Bertrand:啊,好的 - 有趣的信息 - 謝謝!是否會有'EODAY()'函數? :-) –
EOMONTH()不適用於SQL Server 2008.它是SQL Server 2012的一項新功能。 –
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
這個查詢的哪部分你不明白? – Arvo
參見[蒂博爾Karaszi的最終引導到datetime數據類型:擺脫時間部分的](http://www.karaszi.com/sqlserver/info_datetime.asp#GettingRidOfTimePortion):「的DATEADD/DATEDIFF版本可以很容易地改變,以獲取當前月份,季度或年份的開始...「 – onedaywhen
您顯示的示例有兩種方式存在缺陷。 (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' ......使得代碼更加自我記錄。 –