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

我需要确定SQL Server中给定date在一个月内的天数。

有一个内置的function? 如果不是,我应该使用什么作为用户定义的function?

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

datediff(day, @date, dateadd(month, 1, @date)) 

为了使每个date的工作:

 datediff(day, dateadd(day, 1-day(@date), @date), dateadd(month, 1, dateadd(day, 1-day(@date), @date))) 

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

 DECLARE @ADate DATETIME SET @ADate = GETDATE() SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth 

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

 DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0))) 

把它放在一个函数中,或者直接使用它。 这回答了原来的问题,没有在其他答案中的所有额外的垃圾。

来自其他答案的date示例:

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

更简单的…尝试day(eomonth(@Date))

 --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))) 

就个人而言,如果没有内置函数,我会为它创build一个UDF …

这段代码可以获得当月的天数:

 SELECT datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas 

getdate()更改为需要计算天数的date。

我会build议:

selectdate(EOMONTH(getdate()))

解决scheme1:找出我们当前所在月份的天数

 DECLARE @dt datetime SET @dt = getdate() SELECT @dt AS [DateTime], DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month] 

解决scheme2:查找给定月份 – 年份组合中的天数

 DECLARE @y int, @m int SET @y = 2012 SET @m = 2 SELECT @y AS [Year], @m AS [Month], DATEDIFF(DAY, DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m - 1, 0)), DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m, 0)) ) AS [Days in Month] 

你需要添加一个函数,但是它是一个简单的函数。 我使用这个:

 CREATE FUNCTION [dbo].[ufn_GetDaysInMonth] ( @pDate DATETIME ) RETURNS INT AS BEGIN SET @pDate = CONVERT(VARCHAR(10), @pDate, 101) SET @pDate = @pDate - DAY(@pDate) + 1 RETURN DATEDIFF(DD, @pDate, DATEADD(MM, 1, @pDate)) END GO 
 SELECT Datediff(day, (Convert(DateTime,Convert(varchar(2),Month(getdate()))+'/01/'+Convert(varchar(4),Year(getdate())))), (Convert(DateTime,Convert(varchar(2),Month(getdate())+1)+'/01/'+Convert(varchar(4),Year(getdate()))))) as [No.of Days in a Month] 
 select datediff(day, dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)), dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3, 0)) ) 

尼斯简单,不需要创build任何function工作正常

您需要创build一个函数,但这是为了您的方便。 它工作完美,我从来没有遇到任何错误的计算使用此function。

 CREATE FUNCTION [dbo].[get_days](@date datetime) RETURNS int AS BEGIN SET @date = DATEADD(MONTH, 1, @date) DECLARE @result int = (select DAY(DATEADD(DAY, -DAY(@date), @date))) RETURN @result END 

它是如何工作的:从date中减去date的天数就可以得到上个月的最后一天。 所以,你需要在给定的date添加一个月,减去天数并得到结果的date分量。

我提高了Mehrdad,但是这样也可以。 🙂

 CREATE function dbo.IsLeapYear ( @TestYear int ) RETURNS bit AS BEGIN declare @Result bit set @Result = cast( case when ((@TestYear % 4 = 0) and (@testYear % 100 != 0)) or (@TestYear % 400 = 0) then 1 else 0 end as bit ) return @Result END GO CREATE FUNCTION dbo.GetDaysInMonth ( @TestDT datetime ) RETURNS INT AS BEGIN DECLARE @Result int DECLARE @MonthNo int Set @MonthNo = datepart(m,@TestDT) Set @Result = case @MonthNo when 1 then 31 when 2 then case when dbo.IsLeapYear(datepart(yyyy,@TestDT)) = 0 then 28 else 29 end when 3 then 31 when 4 then 30 when 5 then 31 when 6 then 30 when 7 then 31 when 8 then 31 when 9 then 30 when 10 then 31 when 11 then 30 when 12 then 31 end RETURN @Result END GO 

去testing

 declare @testDT datetime; set @testDT = '2404-feb-15'; select dbo.GetDaysInMonth(@testDT) 

这是另一个…

 Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), DateAdd(month, 1, getdate()))) 

我知道这个问题很老,但我想我会分享我正在使用的。

 DECLARE @date date = '2011-12-22' /* FindFirstDayOfMonth - Find the first date of any month */ -- Replace the day part with -01 DECLARE @firstDayOfMonth date = CAST( CAST(YEAR(@date) AS varchar(4)) + '-' + CAST(MONTH(@date) AS varchar(2)) + '-01' AS date) SELECT @firstDayOfMonth 

 DECLARE @date date = '2011-12-22' /* FindLastDayOfMonth - Find what is the last day of a month - Leap year is handled by DATEADD */ -- Get the first day of next month and remove a day from it using DATEADD DECLARE @lastDayOfMonth date = CAST( DATEADD(dd, -1, DATEADD(mm, 1, FindFirstDayOfMonth(@date))) AS date) SELECT @lastDayOfMonth 

这些可以结合起来创build一个函数来检索一个月的天数,如果需要的话。

 SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY)) 

很好'n'简单,不需要创build任何function

Mehrdad Afshari的答复是最准确的,除了通常这个答案是基于Curtis McEnroe在他的博客中提供的正式math方法https://cmcenroe.me/2014/12/05/days-in-month-formula.html

 DECLARE @date DATE= '2015-02-01' DECLARE @monthNumber TINYINT DECLARE @dayCount TINYINT SET @monthNumber = DATEPART(MONTH,@date ) SET @dayCount = 28 + (@monthNumber + floor(@monthNumber/8)) % 2 + 2 % @monthNumber + 2 * floor(1/@monthNumber) SELECT @dayCount + CASE WHEN @dayCount = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END -- leap year adjustment 

得到没有。 在一个月中我们可以直接使用SQL中的Day()。

请按照我在SQL Server 2005/2008的回答结尾处发布的链接进行操作。

以下示例和结果来自SQL 2012

 alter function dbo.[daysinm] ( @dates nvarchar(12) ) returns int as begin Declare @dates2 nvarchar(12) Declare @days int begin select @dates2 = (select DAY(EOMONTH(convert(datetime,@dates,103)))) set @days = convert(int,@dates2) end return @days end --select dbo.daysinm('08/12/2016') 

导致SQL Server SSMS

  (no column name) 1 31 

处理:

当使用EOMONTH时,无论使用哪种date格式,都将转换为SQL-server的DateTime格式。 那么EOMONTH()的date输出将是2016-12-31,其中2016年为年,12月为月,31日为天。 这个输出在传递给Day()时会给你一个月的总天数。

如果我们想要得到即时的检查结果,我们可以直接运行下面的代码,

 select DAY(EOMONTH(convert(datetime,'08/12/2016',103))) 

要么

 select DAY(EOMONTH(convert(datetime,getdate(),103))) 

以供参考在SQL Server 2005/2008/2012中工作,请按照以下外部链接…

在SQL中查找一个月中的天数

select date_data = dateadd(dd,-1 * datepart(dd,getdate())+ 1,getdate()),last_day = dateadd(dd,-1 * datepart(dd,dateadd(mm,1,getdate())) ,dateadd(mm,1,getdate())),no_of_days = 1 + datediff(dd,dateadd(dd,-1 * datepart(dd,getdate())+ 1,getdate()),dateadd(dd,-1 *date部分(DD,DATEADD(毫米,1,GETDATE())),DATEADD(毫米,1,GETDATE())))

用getdatereplace任何date以获得该特定date的月份

任何date

 select DateDiff(Day,@date,DateAdd(month,1,@date)) 
 DECLARE @date nvarchar(20) SET @date ='2012-02-09 00:00:00' SELECT DATEDIFF(day,cast(replace(cast(YEAR(@date) as char)+'-'+cast(MONTH(@date) as char)+'-01',' ','')+' 00:00:00' as datetime),dateadd(month,1,cast(replace(cast(YEAR(@date) as char)+'-'+cast(MONTH(@date) as char)+'-01',' ','')+' 00:00:00' as datetime))) 

SQLServer2012中的简单查询:

selectdate(('20-05-1951 22:00:00'))

我testing了很多date,它总是返回一个正确的结果

 DECLARE @date DATETIME = GETDATE(); --or '12/1/2018' (month/day/year) SELECT EOMONTH ( @date ) AS 'This Month'; SELECT EOMONTH ( @date, 1 ) AS 'Next Month'; 

结果:本月2018-12-31

下个月2019-01-31