2009-06-26 4 views
37

Мне нужно получить последний день месяца, указанный как дата в SQL. Если у меня в первый день месяца, я могу сделать что-то вроде этого:Получить последний день месяца в SQL

DATEADD(DAY, DATEADD(MONTH,'2009-05-01',1), -1) 

Но кто-нибудь знает, как обобщить его, так что я могу найти последний день месяца для любой заданной даты?

ответ

50

Вот моя версия. Ни одна строка манипуляции или отливка не требуется, только один вызов каждый к функциям DATEADD, YEAR и MONTH:

DECLARE @test DATETIME 
SET @test = GETDATE() -- or any other date 

SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1) 
+0

Очень приятно! Спасибо :) –

2

Просто продлить вашу формулу из немного:

dateadd(day, -1, 
    dateadd(month, 1, 
     cast(month('5/15/2009') as varchar(2)) + 
     '/1/' + 
     cast(year('5/15/2009') as varchar(4))) 
-2

Функция LAST_DAY работает хорошо для этого.

Редактировать: На самом деле, как упоминалось в комментариях, это, вероятно, не для всех SQL. Я оставлю сообщение в случае, если кто-то ищет ответ MySQL/Oracle, наткнувшись на него.

Из mysql reference manual:

LAST_DAY(date) 

принимает значение даты или DATETIME и возвращает соответствующее значение для последнего дня месяца. Возвращает NULL, если аргумент недействителен.

mysql> SELECT LAST_DAY('2003-02-05'); 
     -> '2003-02-28' 
mysql> SELECT LAST_DAY('2004-02-05'); 
     -> '2004-02-29' 
mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); 
     -> '2004-01-31' 
mysql> SELECT LAST_DAY('2003-03-32'); 
     -> NULL 

LAST_DAY() доступен с MySQL 4.1.1.

+0

только оракул хотя? –

+1

-1: LAST_DAY не является T-SQL. Однако он доступен в Oracle и MySQL. – Eric

+0

В SQL Server? (теги) –

11

Вы можете получить дни в дату, используя функцию DAY():

dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date))) 
+0

Умный подход. Кажется, это так очевидно! – Eric

+0

Msg 8116, Level 16, State 1, Line 1 Тип аргумента varchar недействителен для аргумента 2 функции dateadd. – Raj

+0

Я установил синтаксис для вас. DATEADD is '(datepart, distance, date)'. – Eric

0

Мои 2 цента:

select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,'2008-02-12')-1)),'2008-02-12'))) 

Раджа

40

С SQL Server 2012 вы можете использовать функцию EOMONTH.

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

Синтаксис

EOMONTH (start_date [, month_to_add ]) 

Как ... я могу найти последний день месяца для любой заданной даты?

SELECT EOMONTH(@SomeGivenDate) 
+1

Ha, Denali не существует в 09;) +1 в любом случае. –

+3

+1 для сексуального нового способа делать что-то в SQL Server, что является старым способом в Excel! –

3

На основании заявления:

SELECT DATEADD(MONTH, 1, @x)   -- Add a month to the supplied date @x 

и

SELECT DATEADD(DAY, 0 - DAY(@x), @x) -- Get last day of month previous to the supplied date @x 

как о добавлении в месяц до даты @x, а затем извлекая последний день месяца, предшествующего тому, что (т. е. последний день месяца предоставленной даты)

DECLARE @x DATE = '20-Feb-2012' 
SELECT DAY(DATEADD(DAY, 0 - DAY(DATEADD(MONTH, 1, @x)), DATEADD(MONTH, 1, @x))) 

Примечание: Это был тест с использованием SQL Server 2008 R2

0

с помощью SQL Server 2005, это работает для меня:

select dateadd(dd,-1,dateadd(mm,datediff(mm,0,YOUR_DATE)+1,0)) 

В принципе, вы получаете количество месяцев с начала (SQL Server) для YOUR_DATE. Затем добавьте один к нему, чтобы получить порядковый номер следующего месяца. Затем вы добавляете это количество месяцев в 0, чтобы получить дату, которая является первым днем ​​следующего месяца. Из этого вы затем вычитаете день, чтобы добраться до последнего дня YOUR_DATE.

1

Использование SQL Server, вот еще один способ найти последний день месяца:

SELECT DATEADD(MONTH,1,GETDATE())- day(DATEADD(MONTH,1,GETDATE())) 
2

Я знаю, что это старый вопрос, но здесь другое решение, которое работает для меня

SET @dtDate = "your date" 
DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0)) 

И если кто-то ищет разные примеры, вот ссылка http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/

Надеюсь, это поможет кому-то еще. stackoverflow Rocks !!!!

0

Это работает для меня, с помощью Microsoft SQL Server 2005:

DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0)) 
0

Возьмем некоторую базовую дату, которая является 31-то месяца, например, '20011231'. Затем используйте процедуру
(я привел 3 одинаковых примера ниже, только значение @dt отличается).

declare @dt datetime; 

set @dt = '20140312' 

SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231'); 



set @dt = '20140208' 

SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231'); 



set @dt = '20140405' 

SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231'); 
1

WinSQL, чтобы получить последний день последнего месяца (т.е.e сегодня - 2017-02-09, возвращается 2017-01-31: Выберите дату (день, день) (сегодня()), сегодня())

1

Попробуйте выполнить следующий запрос, это даст вам все вы хотите :)

Declare @a date =dateadd(mm, Datediff(mm,0,getdate()),0) 
Print('First day of Current Month:') 
Print(@a) 
Print('') 
set @a = dateadd(mm, Datediff(mm,0,getdate())+1,-1) 
Print('Last day of Current Month:') 
Print(@a) 
Print('') 

Print('First day of Last Month:') 
set @a = dateadd(mm, Datediff(mm,0,getdate())-1,0) 
Print(@a) 
Print('') 

Print('Last day of Last Month:') 
set @a = dateadd(mm, Datediff(mm,0,getdate()),-1) 
Print(@a) 
Print('') 


Print('First day of Current Week:') 
set @a = dateadd(ww, Datediff(ww,0,getdate()),0) 
Print(@a) 
Print('') 

Print('Last day of Current Week:') 
set @a = dateadd(ww, Datediff(ww,0,getdate())+1,-1) 
Print(@a) 
Print('') 

Print('First day of Last Week:') 
set @a = dateadd(ww, Datediff(ww,0,getdate())-1,0) 
Print(@a) 
Print('') 

Print('Last day of Last Week:') 
set @a = dateadd(ww, Datediff(ww,0,getdate()),-1) 
Print(@a) 
1

WinSQL: Я хотел бы вернуть все записи за прошлый месяц:

where DATE01 between dateadd(month,-1,dateadd(day,1,dateadd(day,-day(today()),today()))) and dateadd(day,-day(today()),today()) 

Это делает то же самое:

where month(DATE01) = month(dateadd(month,-1,today())) and year(DATE01) = year(dateadd(month,-1,today())) 
2

Для SQL Server 2012 или выше использования EOMONTH to get the last date of month

SQL запроса для отображения даты окончания текущего месяца

DECLARE @currentDate DATE = GETDATE() 
SELECT EOMONTH (@currentDate) AS CurrentMonthED 

SQL запрос для отображения даты конца следующего месяца

DECLARE @currentDate DATE = GETDATE() 
SELECT EOMONTH (@currentDate, 1) AS NextMonthED 
0

Я написал следующее функция, она работает.

Он возвращает тип данных datetime. Нулевой час, минута, секунда, милисекунды.

CREATE Function [dbo].[fn_GetLastDate] 
(
    @date datetime 
) 
returns datetime 
as 
begin 

declare @result datetime 

select @result = CHOOSE(month(@date), 
DATEADD(DAY, 31 -day(@date), @date), 
IIF(YEAR(@date) % 4 = 0, DATEADD(DAY, 29 -day(@date), @date), DATEADD(DAY, 28 -day(@date), @date)), 
DATEADD(DAY, 31 -day(@date), @date) , 
DATEADD(DAY, 30 -day(@date), @date), 
DATEADD(DAY, 31 -day(@date), @date), 
DATEADD(DAY, 30 -day(@date), @date), 
DATEADD(DAY, 31 -day(@date), @date), 
DATEADD(DAY, 31 -day(@date), @date), 
DATEADD(DAY, 30 -day(@date), @date), 
DATEADD(DAY, 31 -day(@date), @date), 
DATEADD(DAY, 30 -day(@date), @date), 
DATEADD(DAY, 31 -day(@date), @date)) 

return convert(date, @result) 

end 

Это очень прост в использовании. 2 пример:

select [dbo].[fn_GetLastDate]('2016-02-03 12:34:12') 

select [dbo].[fn_GetLastDate](GETDATE()) 
+0

Почему бы вам написать свою собственную функцию, чтобы сделать это, когда вы можете просто перевести EOMONTH в DATETIME? выберите [dbo]. [fn_GetLastDate] ('1900-02-03') Не вернет правильный результат. –

+0

Мартин, ты прав. Я не хочу давать альтернативный совет миру :). Просто мне нужна эта функция перед версиями Sql server 2012. –

+0

Он не будет работать в версиях до 2012 года, так как он использует CHOOSE. –

Смежные вопросы