Sql 如何更正此代码?我正试图得到一个基于案例的日期函数

Sql 如何更正此代码?我正试图得到一个基于案例的日期函数,sql,oracle,Sql,Oracle,我试图使用case函数来获取基于上一个日期的值。如果前一个日期是周末,我想避开这个日期,得到最后一个星期五。所以,当一天是星期一时,我想知道星期五的数值 我已经尝试了以下代码,只是日期方面的摘要,但它一直向我显示这个错误 ORA-00936: missing expression 00936. 00000 - "missing expression" *Cause: *Action: Error at Line: 3 Column: 2 代码如下: Select A11.Fact_D

我试图使用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。

以及评论中指出的错误逗号,混合了
sysdate
current\u 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);
或者使用简单的大小写表达式而不是搜索表达式(也将
d
值视为一个数字):

但是,
d
day string/number值取决于NLS设置,因此使用日名称(强制使用特定语言以避免进一步的NLS问题)可能更安全,也可能更清晰:


显示两个区域内的所有三个查询;请注意前两个查询的结果不同,第三个查询的结果相同,无论NLS设置如何。

删除第二行中的逗号谢谢您的帮助!非常感谢你的时间和努力
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;
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;