如何确定SQL Server中一个月的天数?

Eve*_*ien 86 sql sql-server datetime date user-defined-functions

我需要确定SQL Server中给定日期的一个月中的天数.

有内置功能吗?如果没有,我应该使用什么作为用户定义的函数?

Mik*_*son 136

在SQL Server 2012中,您可以使用EOMONTH(Transact-SQL)来获取该月的最后一天,然后您可以使用DAY(Transact-SQL)来获取该月的天数.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 113

您可以在指定月份的第一天使用以下内容:

datediff(day, @date, dateadd(month, 1, @date))
Run Code Online (Sandbox Code Playgroud)

使其适用于每个日期:

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
Run Code Online (Sandbox Code Playgroud)

  • 与 [@Mikael Eriksson 的回答](/sf/answers/1026239021/) 的优雅相比,这里提到的所有解决方案都显得苍白无力。只要提供有效日期而没有针对利基情况的疯狂变通方法,并且代码简单得多,这就会起作用 - 我强烈建议 T-SQL 上的任何人坚持获取 `eomonth` 输出的 `day` 组件。 (4认同)
  • 你不是说:datediff(day,dateadd(day,1-day(@ date),@ date),dateadd(month,1,dateadd(day,1-day(@date),@ date))) (3认同)
  • 这是一个罕见的角落案例,但我偶然发现它:这将在9999年12月引发错误. (3认同)
  • 就像斯坦所说,在某些情况下,这会给出不准确的结果 (2认同)

Dan*_*vis 23

最优雅的解决方案:适用于任何@DATE

DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0)))
Run Code Online (Sandbox Code Playgroud)

把它扔进一个函数或只是内联使用它.这回答了原始问题,而没有其他答案中的所有额外垃圾.

其他答案的日期示例:

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0))) 返回31

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0))) 返回29

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0))) 返回31


小智 19

更简单......试试 day(eomonth(@Date))


Bri*_*edt 11

--Last Day of Previous Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)))

--Last Day of Current Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)))

--Last Day of Next Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)))
Run Code Online (Sandbox Code Playgroud)

就个人而言,如果没有内置函数,我会为它制作一个UDF ...


小智 6

我会建议:

SELECT DAY(EOMONTH(GETDATE()))
Run Code Online (Sandbox Code Playgroud)

  • 这个答案几乎与下面的答案相同,票数为75. (2认同)