Получить последний день месяца в SQL - PullRequest
42 голосов
/ 27 июня 2009

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

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

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

Ответы [ 20 ]

58 голосов
/ 27 июня 2009

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

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

SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
57 голосов
/ 21 июля 2011

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

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

Синтаксис

EOMONTH ( start_date [, month_to_add ] ) 

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

SELECT EOMONTH(@SomeGivenDate)
13 голосов
/ 27 июня 2009

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

dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))
4 голосов
/ 19 мая 2014

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

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 Скалы !!!!

3 голосов
/ 19 ноября 2012

На основании утверждений:

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

2 голосов
/ 09 августа 2018

Работает на 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
2 голосов
/ 27 июня 2009

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

dateadd(day, -1,
    dateadd(month, 1,
        cast(month('5/15/2009') as varchar(2)) + 
        '/1/' + 
        cast(year('5/15/2009') as varchar(4)))
2 голосов
/ 07 августа 2017

Для 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
1 голос
/ 09 февраля 2017

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

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 голос
/ 09 февраля 2017

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()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...