Teradata SQL возвращается предыдущие два месяца, на основе CURRENT_DATE - PullRequest
0 голосов
/ 19 февраля 2020

TLDR: Я хочу получить таблицу с предыдущими двумя месяцами в Teradata на основе CURRENT_DATE. В настоящее время я могу получить только предыдущий месяц:

SELECT 
TO_CHAR(ADD_MONTHS(CURRENT_DATE  - EXTRACT(DAY FROM CURRENT_DATE )+1, -1), 'YYYY-MM') MM;

is

Ожидаемый результат:

+--------+
|   MM   |
+--------+
| 2020-01|
| 2019-12|
+--------+

Длинная версия: Я хочу что-то, что можно было бы использовать в таком большом запросе, как этот, действительный для каждого дня года, без жесткого кодирования дат. Большой запрос с жестко закодированными датами выглядит следующим образом:

AND TO_CHAR(SOME_DATE, 'YYYY-MM') IN ('2020-01', '2019-12')

и работает отлично. Ниже приведены результаты в порядке, но только за 1 месяц.

AND TO_CHAR(SOME_DATE, 'YYYY-MM') IN 
(
TO_CHAR(ADD_MONTHS(CURRENT_DATE  - EXTRACT(DAY FROM CURRENT_DATE )+1, -1), 'YYYY-MM')
)

Попытка добавить запятую и добавить ту же строку с -2, не работает :

AND TO_CHAR(SOME_DATE, 'YYYY-MM') IN 
(
TO_CHAR(ADD_MONTHS(CURRENT_DATE  - EXTRACT(DAY FROM CURRENT_DATE )+1, -1), 'YYYY-MM'),
TO_CHAR(ADD_MONTHS(CURRENT_DATE  - EXTRACT(DAY FROM CURRENT_DATE )+1, -2), 'YYYY-MM')
)

ошибка:

SELECT Failed 3706: Синтаксическая ошибка: ожидалось что-то между ')' и '.'.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2020

Ваш расчет слишком сложен:

TO_CHAR(ADD_MONTHS(CURRENT_DATE  - EXTRACT(DAY FROM CURRENT_DATE )+1, -1), 'YYYY-MM')
= To_Char(Add_Months(Current_Date, -1), 'YYYY-MM')

TO_CHAR(ADD_MONTHS(CURRENT_DATE  - EXTRACT(DAY FROM CURRENT_DATE )+1, -2), 'YYYY-MM')
= To_Char(Add_Months(Current_Date, -2), 'YYYY-MM')

Но ваш подход к сравнению YYYY_MM совершенно неверен.

Assumimg SOME_DATE на самом деле является ДАТА, Кастинг в строку приводит к потере статистики и полному сканированию таблицы, если таблица разбита на эту дату. И то и другое может привести к плохому плану.

Вы должны оставить столбец даты как есть и выполнить все расчеты по CURRENT_DATE:

WHERE som_date BETWEEN Trunc(Add_Months(Current_Date, -2), 'mon')
                   AND Current_Date - Extract(DAY From Current_Date)
1 голос
/ 19 февраля 2020

Почему бы не использовать или

select * from table where 
   (SOME_DATE =  To_char(ADD_MONTHS(CURRENT_DATE , -2),'YYYY-MM') OR 
   SOME_DATE =  To_char(ADD_MONTHS(CURRENT_DATE , -1),'YYYY-MM'))
0 голосов
/ 19 февраля 2020

Попробуйте что-нибудь с подзапросом:

select * from table where date in 
(SELECT To_char(ADD_MONTHS(CURRENT_DATE , -2),'YYYY-MM') MM
union 
SELECT To_char(ADD_MONTHS(CURRENT_DATE , -1),'YYYY-MM') MM
);
...