SQL查询查找当月的最后一天?

Aje*_*sad 4 sql sql-server-2008

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
 LastDay_CurrentMonth
Run Code Online (Sandbox Code Playgroud)

大家好,我有一个查询,找到当月的最后一天,这肯定运作良好,但我无法理解,因为我有其他类似的要求,必须相应地改变它.

有人可以向我解释..先谢谢

Mik*_*son 17

获取DateTime of Now

GETDATE() -- 2011-09-15 13:45:00.923
Run Code Online (Sandbox Code Playgroud)

从'1900-01-01'计算月份的差异

DATEDIFF(m, 0, GETDATE()) -- 1340
Run Code Online (Sandbox Code Playgroud)

将差异添加到'1900-01-01'加上一个月

DATEADD(m, DATEDIFF(m, 0, GETDATE())+1, 0) -- 2011-10-01 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

删除一秒钟

DATEADD(s, -1, DATEADD(m, DATEDIFF(m, 0, GETDATE())+1, 0)) -- 2011-09-30 23:59:59.000
Run Code Online (Sandbox Code Playgroud)

  • 不,我努力根除"EOMONTH",而是实施"BOMONTH","BODAY"等.我还认为"MONTHEND","MONTHSTART"等比缩写更有意义.我输了.目前的逻辑毫无意义.午夜的最后一天有什么好处?我的报告查询需要整个月.我宁愿计算月初,然后运行> =那和<那个+ 1个月.现在,无论数据类型是什么,我都不会丢失或重复计算任何内容.我觉得还有一篇博文警告说"EOMONTH"的危险和无用...... (4认同)
  • +1有很好的解释 - 在[SQL Server"Denali"中,它会更简单](http://connectsql.blogspot.com/2011/08/sql-server-denali-new-function-to-get.html ):`SELECT EOMONTH(GETDATE());`:-) (3认同)
  • @marc_s但一个重要的区别是`EOMONTH`将返回午夜的最后一天.人们认为这将使他们的报告查询变得神奇,但我认为如果他们使用"BETWEEN"和/或不进行相应调整,他们会错过一整天的数据(假设时间成分)会让很多人感到惊讶. (2认同)