104

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

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

4

29 回答 29

168

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

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
于 2013-02-02T09:40:32.267 回答
119

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

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

为了使它适用于每个日期:

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
于 2009-03-27T19:00:08.650 回答
29

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

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

将其放入函数中或仅内联使用它。这回答了原始问题,而其他答案中没有所有额外的垃圾。

其他答案的日期示例:

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

于 2013-10-25T22:42:26.817 回答
26

简单得多...试试day(eomonth(@Date))

于 2013-06-05T14:36:48.657 回答
12
--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)))

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

于 2009-03-27T19:03:11.623 回答
5

我会建议:

SELECT DAY(EOMONTH(GETDATE()))
于 2017-04-05T07:07:48.310 回答
3

此代码为您获取当月的天数:

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

更改getdate()为您需要计算天数的日期。

于 2016-04-28T10:55:49.247 回答
2
   --- sql server below 2012---
    select day( dateadd(day,-1,dateadd(month, 1, convert(date,'2019-03-01'))))
    -- this for sql server 2012--
    select day(EOMONTH(getdate()))
于 2019-03-22T12:54:02.360 回答
1

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

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
于 2009-03-27T19:01:23.530 回答
1
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]
于 2012-03-18T14:34:05.867 回答
1

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

DECLARE @dt datetime
SET     @dt = getdate()

SELECT @dt AS [DateTime],
       DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month]

解决方案 2:查找给定月年组合中的天数

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]
于 2012-08-21T19:34:24.383 回答
1
select  datediff(day, 
        dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)),
        dateadd(day, 0, dateadd(month, ((2013  - 1900) * 12) + 3, 0))
        )

好简单,不需要创建任何功能工作正常

于 2013-04-10T08:39:12.720 回答
1

您需要创建一个函数,但这是为了您自己的方便。它工作得很好,我从来没有遇到过使用这个函数的任何错误计算。

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

它是如何工作的:从日期本身中减去日期的天数会得到上个月的最后一天。因此,您需要在给定日期上加上一个月,减去天数并获得结果的天分量。

于 2015-02-18T12:31:58.853 回答
1
select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
于 2019-04-12T06:42:53.943 回答
0

我赞成 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

去测试

declare @testDT datetime;

set @testDT = '2404-feb-15';

select dbo.GetDaysInMonth(@testDT)
于 2009-03-27T19:33:06.763 回答
0

这是另一个...

Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), 
                         DateAdd(month, 1, getdate())))
于 2009-03-27T19:53:40.333 回答
0

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

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

如果需要,可以将这些组合起来创建一个函数来检索一个月中的天数。

于 2011-12-23T04:12:14.140 回答
0
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))

Nice 'n' Simple,不需要创建任何函数

于 2012-07-13T13:22:49.273 回答
0

Mehrdad Afshari 的回复是最准确的,除了通常这个答案是基于 Curtis McEnroe 在他的博客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
于 2016-07-14T11:53:00.867 回答
0

得到没有。一个月中的天数我们可以直接使用 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 时,无论我们使用哪种日期格式,都会将其转换为SQL-server 的DateTime 格式。那么 EOMONTH() 的日期输出将为 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 中查找一个月中的天数

于 2016-12-08T07:39:27.730 回答
0
DECLARE @date DATETIME = GETDATE(); --or '12/1/2018' (month/day/year) 
SELECT DAY(EOMONTH ( @date )) AS 'This Month'; 
SELECT DAY(EOMONTH ( @date, 1 )) AS 'Next Month';

结果:本月 31

下个月 30

于 2017-09-10T10:11:14.440 回答
0
DECLARE  @m int
SET     @m = 2

SELECT 
       @m AS [Month],
       DATEDIFF(DAY,
                DATEADD(DAY, 0, DATEADD(m, +@m -1, 0)),
                DATEADD(DAY, 0, DATEADD(m,+ @m, 0))
               ) AS [Days in Month]
于 2019-08-29T00:59:49.303 回答
0
RETURN day(dateadd(month, 12 * @year + @month - 22800, -1)) 
select day(dateadd(month, 12 * year(date) + month(date) - 22800, -1)) 
于 2019-10-24T10:10:39.607 回答
0

实现这一点的一种更简洁的方法是使用该datefromparts函数构造一个月的第一天,并从那里计算天数。

CREATE FUNCTION [dbo].[fn_DaysInMonth]
(
    @year INT,
    @month INT
)
RETURNS INT
AS
BEGIN

IF @month < 1 OR @month > 12 RETURN NULL;
IF @year < 1753 OR @year > 9998 RETURN NULL;

DECLARE @firstDay DATE = datefromparts(@year, @month, 1);
DECLARE @lastDay DATE = dateadd(month, 1, @firstDay);

RETURN datediff(day, @firstDay, @lastDay);

END
GO

同样,您可以计算一年中的天数:

CREATE FUNCTION [dbo].[fn_DaysInYear]
(
    @year INT
)
RETURNS INT
AS
BEGIN

IF @year < 1753 OR @year > 9998 RETURN NULL;

DECLARE @firstDay DATE = datefromparts(@year, 1, 1);
DECLARE @lastDay DATE = dateadd(year, 1, @firstDay);

RETURN datediff(day, @firstDay, @lastDay);

END
GO
于 2021-06-08T09:26:25.263 回答
-1

对于任何日期

select DateDiff(Day,@date,DateAdd(month,1,@date))
于 2013-05-21T14:09:26.270 回答
-1

SQLServer2012 中的简单查询:

选择日期(('20-05-1951 22:00:00'))

我测试了很多日期,它总是返回正确的结果

于 2016-04-18T08:10:14.460 回答
-1

选择 first_day=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 *datepart(dd,dateadd(mm,1,getdate())),dateadd(mm,1,getdate())))

用 getdate 替换任何日期以获取该特定日期的月份数

于 2017-01-09T05:17:37.007 回答
-1
DECLARE @Month INT=2,
    @Year INT=1989
DECLARE @date DateTime=null
SET @date=CAST(CAST(@Year AS nvarchar) + '-' + CAST(@Month AS nvarchar) + '-' + '1' AS DATETIME);

DECLARE @noofDays TINYINT 
DECLARE @CountForDate TINYINT
SET @noofDays = DATEPART(MONTH,@date )
SET @CountForDate = 28 + (@noofDays + floor(@noofDays/8)) % 2 + 2 %    @noofDays + 2 * floor(1/@noofDays)   
SET @noofDays= @CountForDate + CASE WHEN @CountForDate = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END
PRINT @noofDays
于 2018-01-31T11:20:14.410 回答
-2
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)))
于 2015-01-05T11:42:18.910 回答