【发布时间】:2017-10-18 19:28:34
【问题描述】:
我需要在 WHERE 子句中写一个 case 语句,即—— 当 current_date 是本月的 1 日时,请选择上个月的第一天和上个月的最后一天之间的数据 ELSE 从当前月份的 1 日至今。到目前为止,我已经写了这个,但它不起作用。 '05/01/2017' 将是输入日期。
SELECT *
FROM MyTable
WHERE calendar_date
BETWEEN
CASE WHEN extract (day from CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY')) =1 --check to see date is 1st of month
THEN ADD_MONTHS((CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1), -1) --1st of prev month
AND ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_date), 0 ) --last day prev month
ELSE CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1, 0) --else 1st of Curr mont
AND CURRENT_DATE
end
order by calendar_date
【问题讨论】:
-
只是一个建议,但您可以在 SELECT 子句中派生所需的字段并将查询包装在一个内联视图(子查询)中。如果您可以从条件逻辑中看到派生值,可能会使代码更易于阅读(和调试)。
-
@Sevyns,你能举个例子说明你的建议吗?
-
一开始,日期文字写成:
date '2017-05-01',如select date '2017-05-01' + 1 -
在 cmets 中可能不是最容易阅读的,但这里是 SELECT ExampleElement1 ,Element2 FROM ( SELECT CASE WHEN 1 = 1 THEN 1 End as ExampleElement1 ,Element2 From MyTable ) WHERE ExampleElement1 = 1是在对其进行约束之前首先(并且在一个位置)正确地获得条件逻辑。可能需要修改语法 - 目前无法在 TD 中使用。
标签: teradata where-clause case-when