Как определить количество дней в месяце в SQL Server? - PullRequest
84 голосов
/ 27 марта 2009

Мне нужно определить количество дней в месяце для данной даты в SQL Server.

Есть ли встроенная функция? Если нет, что я должен использовать в качестве пользовательской функции?

Ответы [ 26 ]

0 голосов
/ 13 июля 2012
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))

Nice 'n' Прост и не требует создания каких-либо функций

0 голосов
/ 18 апреля 2016

простой запрос в SQLServer2012:

выберите день (('20-05-1951 22:00:00'))

Я проверял много дат, и он всегда возвращает правильный результат

0 голосов
/ 27 марта 2009

вот еще один ...

Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), 
                         DateAdd(month, 1, getdate())))
0 голосов
/ 21 мая 2013

На любую дату

select DateDiff(Day,@date,DateAdd(month,1,@date))
0 голосов
/ 05 января 2015
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)))
0 голосов
/ 27 марта 2009

Я проголосовал за Мехрдада, но это тоже работает. :)

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