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

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

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

53
Byron Whitlock 27 Июн 2009 в 02:09

20 ответов

Лучший ответ

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

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

SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
67
LukeH 26 Июн 2009 в 22:28

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

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

Синтаксис

EOMONTH ( start_date [, month_to_add ] ) 

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

SELECT EOMONTH(@SomeGivenDate)
73
Martin Smith 5 Янв 2018 в 19:38

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

dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))
12
Eric 27 Июн 2009 в 16:58

Работает на SQL сервере

Declare @GivenDate datetime
SET @GivenDate = GETDATE()

Select DATEADD(MM,DATEDIFF(MM, 0, @GivenDate),0) --First day of the month 

Select DATEADD(MM,DATEDIFF(MM, -1, @GivenDate),-1) --Last day of the month
5
Sri 9 Авг 2018 в 15:51

Я знаю, что это старый вопрос, но вот еще одно решение, которое мне подходит.

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

4
Goca 20 Май 2014 в 20:06

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

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.

3
marc_s 15 Янв 2016 в 10:22

Для SQL Server 2012 или более поздней версии используйте EOMONTH, чтобы получить последнюю дату месяца.

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

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

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

DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate, 1 ) AS NextMonthED
3
Martijn Pieters 7 Май 2021 в 00:39

Просто немного расширите формулу:

dateadd(day, -1,
    dateadd(month, 1,
        cast(month('5/15/2009') as varchar(2)) + 
        '/1/' + 
        cast(year('5/15/2009') as varchar(4)))
2
Eric 26 Июн 2009 в 22:12

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

DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0))
1
nstCactus 8 Июл 2014 в 03:36

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

1
David 9 Фев 2017 в 13:30

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

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
LONG 9 Фев 2017 в 13:43

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()))
1
Dan Lowe 9 Фев 2017 в 14:41

Этот запрос также можно использовать.

DECLARE @SelectedDate DATE =  GETDATE()

SELECT DATEADD(DAY, - DAY(@SelectedDate), DATEADD(MONTH, 1 , @SelectedDate)) EndOfMonth
1
Serkan Arslan 2 Ноя 2018 в 07:49

Мои 2 цента:

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

Радж

0
Raj 27 Июн 2009 в 00:28

Используя sql server 2005, это работает для меня:

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

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

0
Peter Perháč 20 Май 2013 в 10:49

Возьмите некоторую базовую дату - 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');
0
peter.petrov 17 Сен 2014 в 21:03

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

SELECT DATEADD(MONTH,1,GETDATE())- day(DATEADD(MONTH,1,GETDATE()))
0
marc_s 15 Янв 2016 в 10:22

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

Он возвращает тип данных 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
Başar Kaya 20 Дек 2017 в 07:58

Основываясь на ответе, получившем наибольшее количество голосов по ссылке ниже, я придумал следующее решение:

 declare  @mydate date= '2020-11-09';
  SELECT DATEADD(month, DATEDIFF(month, 0, @mydate)+1, -1) AS lastOfMonth

Ссылка: Как выбрать первый день месяца в SQL?

0
ZF007 9 Ноя 2020 в 12:17
---Start/End of previous Month 
Declare @StartDate datetime, @EndDate datetime

set @StartDate = DATEADD(month, DATEDIFF(month, 0, GETDATE())-1,0) 
set @EndDate = EOMONTH (DATEADD(month, DATEDIFF(month, 0, GETDATE())-1,0)) 

SELECT @StartDate,@EndDate
-1
Nathan Champion 16 Янв 2019 в 00:21