Выберите первый день предыдущего месяца в (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.


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

ROUND_TIMESTAMP (somedate,'W')

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');