我正在尝试使用case函数来获取基于先前日期的值。如果以前的日期是周末,那么我想避免使用该日期并获得最后一个星期五。因此,例如。当一天是星期一时,我想要星期五的值。
我尝试了以下代码,仅是日期方面的摘要,但始终显示此错误
ORA-00936: missing expression
00936. 00000 - "missing expression"
*Cause:
*Action:
Error at Line: 3 Column: 2
代码如下:
Select
A11.Fact_Date Fact_Date,
From XX.X_XX_XX_XX a11
where (A11.Fact_Date =
Case
When To_Char(SYSDATE, 'd') = 7 Then A11.Fact_Date = (CURRENT_DATE - 2)
When To_Char(SYSDATE, 'd') = 1 Then A11.Fact_Date = (CURRENT_DATE - 3)
Else A11.Fact_Date = (CURRENT_DATE - 1)
End);
这似乎是一个愚蠢的问题,但是由于我是SQL的新手,我将不胜感激。
答案 0 :(得分:1)
以及注释中指出的逗号,sysdate
和current_date
的混合看起来很奇怪,并可能引起奇怪的问题(因为它们可能代表不同的日子);并且都包含时间,因此您可能希望将表值与trunc(case ... end)
进行比较-并且您不会在该子句中重复该列:
select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(
case
when to_char(sysdate, 'd') = '1' then sysdate - 3
when to_char(sysdate, 'd') = '7' then sysdate - 2
else sysdate - 1
end);
,或者用简单的case表达式代替搜索的表达式(也将d
值视为数字):
select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(sysdate)
- case to_number(to_char(sysdate, 'd'))
when 1 then 3
when 7 then 2
else 1
end;
但是,d
天的字符串/数字值取决于您的NLS设置,因此使用日期名称(为了避免进一步的NLS问题而强制使用特定语言)可能更安全-甚至更清晰-使用:
select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(sysdate)
- case to_char(sysdate, 'FMDay', 'NLS_DATE_LANGUAGE=ENGLISH')
when 'Monday' then 3
when 'Sunday' then 2
else 1
end;
db<>fiddle显示两个地区的所有三个查询;请注意,前两个查询的结果不同,并且无论NLS设置如何,第三个查询都是相同的。