Выберите первый день предыдущего месяца в (DB2) SQL - PullRequest
7 голосов
/ 30 июня 2009

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

CURRENT DATE - 1 MONTH

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

Ответы [ 6 ]

11 голосов
/ 30 сентября 2009

Первый день текущего месяца:

CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS 

Первое число текущего года -

CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - (MONTH(CURRENT_DATE)-1) MONTHS 

Последний день последнего месяца:

CURRENT_DATE - DAY(CURRENT_DATE) DAYS 

Первый день последнего месяца:

CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - 1 MONTH 
10 голосов
/ 30 июня 2009

Первый день этого года:

date('0001-01-01') + year(current date) years - 1 year

Первый день этого месяца:

date('0001-01-01') + year(current date) years - 1 year + month(current date) months - 1 month

Первый день прошлого месяца:

date('0001-01-01') + year(current date) years - 1 year + month(current date) months - 2 months
3 голосов
/ 01 мая 2017

Вот отрывки из моего Шпаргалка по расчету месяца SQL для DB2:

Начало текущего месяца:

CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS

Конец текущего месяца:

LAST_DAY(CURRENT DATE)

Начало предыдущего месяца:

CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS - 1 MONTHS

Конец предыдущего месяца:

LAST_DAY(CURRENT DATE - 1 MONTHS)

Начало следующего месяца:

CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS + 1 MONTHS

Конец следующего месяца:

LAST_DAY(CURRENT DATE + 1 MONTHS)
1 голос
/ 23 июля 2014

LUW 9.7 (и я думаю z / os) методы с использованием встроенных функций.

Последний день текущего месяца:

LAST_DAY(CURRENT DATE)

Первый день предыдущего месяца:

LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY or (LUW) TRUNCATE(CURRENT DATE - 1 month, 'MONTH')

Первый день текущего месяца:

LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY or (LUW) TRUNCATE(CURRENT DATE, 'MONTH');  
1 голос
/ 14 июля 2009

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

Сверху я делал

date('0001-01-31') + year(date(prevQdate))years - 1 year + month(prevQdate) months + 2 months)

Что не давало мне того, что я хотел, иногда дата была 30-й вместо 31-го по месяцам с 31 днем ​​...

Изменение на

date('0001-01-31') + year(date(prevQdate))years - 1 year + **(month(prevQdate) + 2)** months)

Дай мне то, что я хотел. Похоже, первое добавление Месяцев с предыдущей даты квартала сбрасывало часть ДЕНЬ моей даты, и, таким образом, второе добавление месяцев работало с датой, на которую месяц приходилось всего 30 дней.

Просто следует опасаться при использовании этого метода манипулирования датами в DB2.

0 голосов
/ 30 июня 2009

Я считаю, что следующее будет работать для вас.

ROUND_TIMESTAMP (somedate,'W')
...