如何更正此代码?我正在尝试基于案例获取日期函数

时间:2019-04-08 10:10:42

标签: sql oracle

我正在尝试使用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的新手,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

以及注释中指出的逗号,sysdatecurrent_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设置如何,第三个查询都是相同的。