【问题标题】:SQL query to find last day of current month?SQL查询查找当前月份的最后一天?
【发布时间】:2011-09-15 11:16:07
【问题描述】:
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
 LastDay_CurrentMonth

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

谁能给我解释一下.. 提前致谢

【问题讨论】:

  • 这个查询的哪一部分你不明白?
  • 参见Tibor Karaszi's ultimate guide to the datetime datatypes: Getting rid of the time portion:“dateadd/datediff 版本可以轻松更改以获取当前月、季度或年的开始...”
  • 您展示的样本在两个方面存在缺陷。 (1)当月最后一天的last second有什么用?如果 SMALLDATETIME 它无论如何都会四舍五入;如果是 DATETIME 或 DATETIME2,您将丢失最后一秒发生的一些数据。总是更好地使用 >= 这个月和 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/… (2) 只是迂腐,但 SPELL OUT SECONDMONTH 而不是使用 smmm... 使代码 更多自我记录。
  • 谢谢@Arvo,你可以看看下面的评论。
  • Thanx @Onedaywhen 那是个好东西.......

标签: sql sql-server-2008


【解决方案1】:

获取现在的日期时间

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

【讨论】:

  • +1 以获得很好的解释 - 在 SQL Server "Denali", it will be much simpler: SELECT EOMONTH (GETDATE()); :-)
  • @marc_s 但一个重要的区别是EOMONTH 将在午夜返回最后一天。人们认为这将使他们的报告查询变得神奇,但我认为如果他们使用BETWEEN 和/或不进行相应调整,他们会丢失一整天的数据(假设是时间组件)时会感到惊讶。
  • @Aaron Bertrand:啊,好的-有趣的信息-谢谢!还会有EODAY() 函数吗? :-)
  • 不,我努力消除EOMONTH,而是实现BOMONTHBODAY等。我还认为MONTHENDMONTHSTART等比缩写更有意义.我输了。目前的逻辑没有意义。午夜的最后一天有什么好处?我的报告查询需要整个月。我宁愿计算月初,然后运行 ​​>= that 和 EOMONTH 即将到来的危险和无用...
  • @MasterJoe 那么您使用的 SQL Server 版本不受支持。你可以做一个内联表值函数。出于性能原因,您应该远离标量 UDF。 SQL Server 2019 中已经完成了一些工作来解决标量 UDF 的问题。 Scalar UDF Inlining.
【解决方案2】:

这将为您提供当月的最后一天,但忽略时间

选择 EOMONTH(GETDATE())

From Microsoft tech net

【讨论】:

  • EOMONTH() 不适用于 SQL Server 2008。它是 SQL Server 2012 的新功能。
【解决方案3】:
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

【讨论】:

    【解决方案4】:

    SELECTDATEPART(DD,EOMONTH(GETDATE()))AS '当月的最后一天'

    • 这里DATEPART函数用于打印一天的整数部分。如果要问天的名称,那么我们必须使用DATENAME()函数。

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

    • GETDATE() 代表当前月份。

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多