loading..
Русский    English
08:06
листать

Функция EOMONTH

Как узнать последний день месяца по заданной дате, например, текущего месяца?

Текущую дату мы можем узнать, используя встроенную функцию current_timestamp:

Консоль
Выполнить
  1. SELECT current_timestamp;

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

Консоль
Выполнить
  1. SELECT dateadd(dd, -day(current_timestamp), current_timestamp);

Тогда для текущего месяца нам потребуется предварительно добавить один месяц к текущей дате:

Консоль
Выполнить
  1. SELECT dateadd(dd, -day(dateadd(mm, 1, current_timestamp)),
  2. dateadd(mm, 1, current_timestamp));

Уберем, наконец, из полученного результата компоненту времени:

Консоль
Выполнить
  1. SELECT CAST(
  2. dateadd(dd, -day(dateadd(mm, 1, current_timestamp)), dateadd(mm, 1, current_timestamp))
  3. AS date);

В  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft.SQL Server 2012 появилась функция EOMONTH, которая позволяет сделать то же самое без применения "процедурной" логики:

Консоль
Выполнить
  1. SELECT CAST(
  2. dateadd(dd, -day(dateadd(mm, 1, current_timestamp)),
  3. dateadd(mm, 1, current_timestamp)) AS date
  4. ) old_way, eomonth(current_timestamp) new_way;

Если вы получаете ошибку при выполнении последнего запроса, значит учебник еще не переехал на версию SQL Server, поддерживающую EOMONTH.

Ну, а для времени, когда я написал этот запрос, результаты, естественно, совпали:

old_way    new_way
2016-07-31    2016-07-31

Мы уже знаем, что функция OFMONTH имеет аргументом выражение типа даты. Кроме того, функция имеет также второй (необязательный) целочисленный аргумент, представляющий число месяцев, которые, при наличии, будут добавлены к дате, представленной первым аргументом. Например, следующий запрос даст нам последние дни предыдущего, текущего и следующего месяца для даты '2016-01-28':

Консоль
Выполнить
  1. SELECT eomonth('2016-01-28',-1) prev_month,
  2.                    eomonth('2016-01-28') this_month,
  3.                    eomonth('2016-01-28', 1) next_month;

prev_month    this_month    next_month
2015-12-31    2016-01-31    2016-02-29

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MONTH MySQL Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100