Выберите первый день предыдущего месяца в (DB2) SQL
Мне нужно проверить, находится ли данная дата в предыдущем месяце для ежемесячного запроса. Я могу получить
CURRENT DATE - 1 MONTH
чтобы сравнить выбранную дату С, но я не могу предположить, что текущая дата будет первым днем каждого месяца точно. Есть ли встроенный способ получить первый день месяца без извлечения года и месяца и склеивания его вместе?
6 ответов
первый день этого года:
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
первый день текущего месяца:
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
вот фрагменты из моего чит-листа расчета месяца 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)
чтобы дополнить это дополнительной информацией. Решение выше идеально, если вы хотите первый день месяца, скажем, вы хотите последний день месяца, или в моем случае я хочу последний день следующего квартала.
сверху я делал
date('0001-01-31') + year(date(prevQdate))years - 1 year + month(prevQdate) months + 2 months)
который не давал мне то, что я хотел, иногда дата была 30th вместо 31st в течение месяцев с 31 дней...
изменение его
date('0001-01-31') + year(date(prevQdate))years - 1 year + **(month(prevQdate) + 2)** months)
дал мне то, что я хотел. Выглядит первое добавление месяцев с даты квартала prev было сбросом дневной части моей даты, и, таким образом, второе добавление месяцев работало на дату только с 30 днями в месяце.
просто нужно быть осторожным при использовании этого метода обработки дат в DB2.
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');