查询当前月份的最后一天的 SQL 查询语句?

5
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
 LastDay_CurrentMonth

大家好,我有一个查询来查找当前月份的最后一天,它肯定可以正常工作,但我无法理解它,因为我有其他类似的要求并需要相应地进行更改。

有人能给我解释一下吗? 提前感谢。


1
你不理解这个查询的哪一部分? - Arvo
参见Tibor Karaszi的日期时间数据类型终极指南:摆脱时间部分:"可以轻松地变化dateadd/datediff版本,以获取当前月、季度或年的开始..." - onedaywhen
2
你展示的样例有两个问题。(1)在月底的最后一秒使用有什么用?如果是SMALLDATETIME,它会四舍五入;如果是DATETIME或DATETIME2,你将会失去发生在那最后一秒的一些数据。始终最好使用>=这个月和<下个月。除了Tibor的优秀文章外,请参阅https://sqlblog.org/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries (2)只是一点小题大做,但拼写出SECONDMONTH而不是使用smmm...使代码更加自我记录。 - Aaron Bertrand
谢谢@Arvo,你可以看一下下面的评论。 - Ajendra Prasad
谢谢@Onedaywhen,这是好东西....... - Ajendra Prasad
显示剩余2条评论
4个回答

20

获取当前时间的日期时间。

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

去掉一秒钟

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

3
谢谢你的夸奖!在SQL Server "Denali"版本中,获取当前月份最后一天将变得更加简单。只需执行以下代码:SELECT EOMONTH (GETDATE());。 :-) - marc_s
2
@marc_s 但是一个重要的区别是,EOMONTH将返回午夜的最后一天。人们认为这会使他们的报告查询变得神奇,但我认为如果他们使用BETWEEN和/或不进行相应调整,许多人会惊讶地发现缺少了一整天的数据(假设有时间组件)。 - Aaron Bertrand
@Aaron Bertrand:啊,好的 - 有趣的信息 - 谢谢!会有EODAY()函数吗? :-) - marc_s
4
不,我争取废除“EOMONTH”,而是实现“BOMONTH”、“BODAY”等函数。我还认为,“MONTHEND”、“MONTHSTART”等名称比缩写要更有意义得多。但是,我失败了。目前的逻辑毫无意义。午夜时分的最后一天有什么用呢?我的报表查询需要整个月的数据。我更愿意计算月初,然后运行 >= 该值并且 < 该值 + 1 个月的查询。现在,无论数据类型是什么,我都不会丢失或重复计算任何东西。我感觉自己要写另一篇博客文章,警告人们“EOMONTH”的危险和无用性... - Aaron Bertrand
1
@MasterJoe 那么您正在使用不受支持的 SQL Server 版本。 您可以使用内联表值函数,出于性能原因,应避免使用标量 UDF。 SQL Server 2019 中已经针对标量 UDF 问题进行了一些工作。标量 UDF 内联 - Mikael Eriksson
显示剩余5条评论

2

2
EOMONTH() 函数不适用于 SQL Server 2008。它是 SQL Server 2012 的新功能。 - Guilherme de Jesus Santos

0

SELECT DATEPART (DD,EOMONTH(GETDATE())) AS '当前月份的最后一天'

  • 这里使用DATEPART函数来打印日期的整数部分。如果要求日期的名称,则需要使用DATENAME()函数。

  • 在查询中,最后一天表示月底,因此我们使用了EOMONTH()函数。

  • GETDATE()用于表示当前月份。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接