Teradata SQL 返回前两个月,基于 CURRENT_DATE

Teradata SQL returning previous two months, based on CURRENT_DATE

TLDR: 基于 CURRENT_DATE,我想在 Teradata 中获得前两个月的 table。目前我只能得到上个月:

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

预期输出为:

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

长版: 我想要一些东西,可以用在像这样更大的查询中,对一年中的每一天都有效,而无需对日期进行硬编码。带有硬编码日期的更大查询如下所示:

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

而且效果很好。下面的 returns 结果还可以,但只能使用 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: Syntax error: expected something between ')' and '.'.

尝试使用子查询:

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

为什么不使用 or

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

你的计算太复杂了:

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 实际上是一个 DATE 将其转换为字符串会导致丢失统计信息,如果 table 在该日期之前被分区,则会导致完整 Table 扫描。两者都可能导致一个糟糕的计划。

您应该保持日期列不变,并在 CURRENT_DATE:

上进行所有计算
WHERE som_date BETWEEN Trunc(Add_Months(Current_Date, -2), 'mon')
                   AND Current_Date - Extract(DAY From Current_Date)