Запрос DB2 для извлечения данных за последний месяц. в текущем месяце

#sql #database #db2

#sql #База данных #db2

Вопрос:

Каждый месяц я должен извлекать записи за предыдущий месяц из базы данных Db2. Как я могу написать запрос Db2 для извлечения данных за последний месяц без жесткого кодирования диапазона дат? Например, при запуске в декабре 2021 года запрос вернет записи, датированные между ‘2021-11-01’ И ‘2021-11-30’, и эти даты будут динамически меняться, когда я выполняю тот же запрос месяцем позже.

Комментарии:

1. Вы проверили раздел » Операции с датами и длительностями » с CURRENT DATE использованием специального реестра? Что вы пробовали до сих пор?

Ответ №1:

Легко можно предварительно вычислить диапазон дат в cte, а затем использовать его в основном запросе. Предполагая, что в вашей таблице t есть ts столбец для фильтрации, вы можете сделать:

 with
r as (
  select
    to_date(year(c) || '-' || month(c) || '-01' , 'YYYY-MM-DD') as e,
    to_date(year(p) || '-' || month(p) || '-01' , 'YYYY-MM-DD') as b
  from (
    select current date as c, current date - 1 month as p from sysibm.sysdummy1
  ) x
)
select * 
from t 
cross join r
where t.ts >= r.b and t.ts < r.e
 

Смотрите Пример в db<>fiddle .

Ответ №2:

Есть несколько способов описать предыдущий месяц как диапазон дат в SQL-запросе Db2. Некоторые функции SQL datetime недоступны в Db2 для z / OS, но даже в этом случае вы все равно можете использовать арифметику даты и LAST_DAY() функцию.

Первый день последнего месяца: LAST_DAY(CURRENT DATE - 2 MONTHS) 1 DAY

Последний день прошлого месяца: LAST_DAY(CURRENT DATE - 1 MONTH)

Первый день этого месяца: LAST_DAY(CURRENT DATE - 1 MONTH) 1 DAY

Инклюзивно-эксклюзивный пример (предпочтительный подход):

 SELECT ... WHERE someDateTimeColumn >= LAST_DAY(CURRENT DATE - 2 MONTHS)   1 DAY 
AND someDateTimeColumn < LAST_DAY(CURRENT DATE - 1 MONTH)   1 DAY
 

Инклюзивный-инклюзивный пример (вызов DATE() функции предотвратит неявное преобразование типов, которое может пропустить некоторые некоторые соответствующие строки):

 SELECT ... WHERE someDateTimeColumn >= LAST_DAY(CURRENT DATE - 2 MONTHS)   1 DAY 
AND DATE(someDateTimeColumn) <= LAST_DAY(CURRENT DATE - 1 MONTH)
 

Если вы запрашиваете Db2 для LUW версии 11.1 или новее, вы также можете вызвать THIS_MONTH() функцию, чтобы получить первый день входного месяца.

Первый день последнего месяца: THIS_MONTH(CURRENT DATE - 1 MONTH)

Первый день этого месяца: THIS_MONTH(CURRENT DATE)

Включительно-эксклюзивный пример:

 SELECT ... WHERE someDateTimeColumn >= THIS_MONTH(CURRENT DATE - 1 MONTH) 
AND someDateTimeColumn < THIS_MONTH(CURRENT DATE)
 

Комментарии:

1. Привет, я использовал этот запрос, но данные за последний месяц не были получены. только до 29-11-2021. ВЫБЕРИТЕ * из NIG.CARTGAR, ГДЕ ВРЕМЕННАЯ МЕТКА> = LAST_DAY(ТЕКУЩАЯ ДАТА — 2 МЕСЯЦА) 1 ДЕНЬ И ВРЕМЕННАЯ МЕТКА < LAST_DAY(ТЕКУЩАЯ ДАТА — 1 МЕСЯЦ) 1 ДЕНЬ

2. Второй подход, включающий инклюзивный пример, не сработал. отображается нулевая запись.

3. Третий подход также показывает только данные до 29 ноября 2021 года. данные за последний день месяца не извлекаются:

4. Третий подход сработал. Я взял столбец даты (который содержит только дату) вместо столбца метки времени. Большое вам спасибо за вашу поддержку

5. Я исправил пример с включением включительно, а также добавил явное приведение к ДАТЕ, чтобы запрос работал с данными временных МЕТОК.