2009-06-30 2 views
6

Мне нужно проверить, соответствует ли данная дата в предыдущем месяце для ежемесячного запроса. Я могу получитьВыберите первый день предыдущего месяца в (DB2) SQL

CURRENT DATE - 1 MONTH 

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

ответ

10

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

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 
+0

Ницца, они довольно безболезненны. Благодарю. –

0

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

ROUND_TIMESTAMP (somedate,'W') 
+0

Я не вижу, что функции, перечисленные в DB2 для платформ Linux, UNIX и Windows. Вероятно, он доступен только для мэйнфреймов DB2. –

+1

Мой плохой. строго z/OS. Это никогда не перестает удивлять меня, как компания может выпускать один продукт и не иметь как можно более универсальной функциональности на всех платформах. Я не могу представить, что есть одна причина, по которой это не будет работать повсюду. Вне этого, я не знаю другого решения, кроме того, что вы разместили ниже ИЛИ разрывая текущую дату вниз в строковые фрагменты MONTH, DAY, YEAR, изменяя MONTH и DAY, а затем перестраивая новую дату. – moleboy

+0

Позор, это выглядело идеально, когда я его посмотрел. –

1

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

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

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

Который не дает мне то, что я хотел, иногда дата была тридцатые вместо 31 в течение нескольких месяцев с 31 дней ...

Изменение его

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

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

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

+1

Самый надежный способ создать последний день месяца - построить выражение, которое производит первый день месяца после него, а затем вычесть один день. Последний день следующего квартала, например, DATE ('0001-01-01') + ГОД (ТЕКУЩАЯ ДАТА) ЛЕТ - 1 ГОД + ((КВАРТАЛ (ТЕКУЩАЯ ДАТА) +1) * 3) МЕСЯЦЫ - 1 ДЕНЬ –

11

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

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 
0

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

Вот отрывки из моего 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) 
Смежные вопросы