Как рассчитать последний день месяца в SQL?

в частности MSSQL 2005.

9 ответов


вот решение, которое дает вам последнюю секунду текущего месяца. Вы можете извлечь часть даты или изменить ее, чтобы вернуть только день. Я протестировал это на SQL Server 2005.

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );

чтобы понять, как это работает, мы должны смотреть на dateadd () и datediff () функции.

DATEADD(datepart, number, date)  
DATEDIFF(datepart, startdate, enddate)

если вы запустите только самый внутренний вызов datediff (), вы получите номер текущего месяца с отметки времени 0.

select datediff(m, 0, getdate() );  
1327

следующий часть добавляет Это количество месяцев плюс 1 к отметке времени 0, давая вам начальную точку следующего календарного месяца.

select dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 );
2010-09-01 00:00:00.000

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

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
2010-08-31 23:59:59.000


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

добавьте один месяц к текущей дате, а затем вычитайте значение, возвращаемое функцией DAY, примененной к текущей дате, используя функции DAY и DATEADD.

dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))

SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')

объяснение:

общий подход: используйте временную функциональность.

SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'

это литералы DATETIME, являющиеся первой гранулой времени в первый и последний день соответственно того же 31-дневного месяца. Какой месяц выбран, совершенно произвольно.

SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)

это разница в целых месяцах между первым днем контрольного месяца и текущей меткой времени. Назовем это @calc.

SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')

это добавляет @calc месячные гранулы до последнего дня контрольного месяца, результатом которого является текущая временная метка, "округленная" до последнего дня своего месяца. Д. Е. В.


попробуйте это:

DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)

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

ниже Шаг за шагом способ написать запрос:

в SQL Server дата начинается с 1901/01/01 (дата 0) и до сих пор каждый месяц может быть идентифицирован по номеру. Месяц 12-первый месяц 1902 года означает январь. 1200 месяц-январь 2001 года. Точно так же каждый день может быть назначен уникальным номером e.g дата 0-1901/01/01. Дата 31 является 1901/02/01 как Январь 1901 года начинается с 0.

найти первый день текущего месяца(текущая дата или дата)

  1. Сначала нам нужно проверить, сколько месяцев прошло с даты 0 (1901/01/01). ВЫБЕРИТЕ DATEDIFF (MM,0,GETDATE ())
  2. добавить такое же количество месяцев на дату 0(1901/01/01)

    ВЫБЕРИТЕ DATEADD(MM, DATEDIFF (MM,0,GETDATE ()), 0)

тогда мы получим первый день текущего месяц(текущая дата или дата)

чтобы получить последний день прошлого месяца

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

ВЫБЕРИТЕ DATEADD (SS, -1, DATEADD (MM, DATEDIFF (MM, 0, GETDATE ()), 0))

чтобы получить последний день текущего месяца

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

SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0)

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

ВЫБЕРИТЕ ФУНКЦИЯ DATEADD(СС -1,ФУНКЦИЯ DATEADD(ММ, ФУНКЦИЯ DATEDIFF(ММ,0,GETDATE ()) ДЛЯ+1,0))

надеюсь, что поможет.


используя SQL2005, у вас нет доступа к полезной функции EOMONTH(), поэтому вы должны вычислить это сами.

эта простая функция будет работать аналогично функция eomonth

CREATE FUNCTION dbo.endofmonth(@date DATETIME= NULL)
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, -1, DATEADD(MM, +1, DATEADD(DD, 1 - DATEPART(DD, ISNULL(@date,GETDATE())), ISNULL(@date,GETDATE()))))
END

запрос выполнить:

SELECT dbo.endofmonth(DEFAULT)  --Current month-end date
SELECT dbo.endofmonth('02/25/2012') --User-defined month-end date


DECLARE
  @Now datetime,
  @Today datetime,
  @ThisMonth datetime,
  @NextMonth datetime,
  @LastDayThisMonth datetime

SET @Now = getdate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0)
SET @NextMonth = DateAdd(mm, 1, @ThisMonth)
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth)

иногда вам действительно нужен последний день этого месяца, но часто то, что вы действительно хотите, это описать временной интервал этого месяца. Это лучший способ описать временной интервал этого месяца:

WHERE @ThisMonth <= someDate and someDate < @NextMonth

для полноты, в Oracle вы бы сделали что-то вроде ...

select add_months(trunc(sysdate,'MM'),1) ...

или

select last_day(sysdate)+1 ...

DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))