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

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

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

Ответы [ 26 ]

131 голосов
/ 02 февраля 2013

В SQL Server 2012 вы можете использовать EOMONTH (Transact-SQL) , чтобы получить последний день месяца, а затем вы можете использовать DAY (Transact-SQL) , чтобы получить количество дней в месяце.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
110 голосов
/ 27 марта 2009

Вы можете использовать следующее с первым днем ​​указанного месяца:

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

Чтобы это работало на каждую дату:

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
22 голосов
/ 26 октября 2013

Самое элегантное решение: работает для любого @ ДАТА

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

17 голосов
/ 05 июня 2013

Намного проще ... попробуйте day(eomonth(@Date))

11 голосов
/ 27 марта 2009
--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 для него, если бы не было встроенной функции ...

6 голосов
/ 05 апреля 2017

Я бы предложил:

SELECT DAY(EOMONTH(GETDATE()))
3 голосов
/ 28 апреля 2016

Этот код возвращает количество дней в текущем месяце:

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

Измените getdate() на дату, на которую нужно рассчитывать дни.

1 голос
/ 10 апреля 2013
select  datediff(day, 
        dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)),
        dateadd(day, 0, dateadd(month, ((2013  - 1900) * 12) + 3, 0))
        )

Nice Simple и не требует создания каких-либо функций. Work Fine

1 голос
/ 21 августа 2012

Решение 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]
1 голос
/ 18 марта 2012
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]
...