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