为什么会出现“缺少表达式”错误?

时间:2019-08-06 20:42:38

标签: sql oracle

我收到此错误

"ORA-00936: missing expression
00936. 00000 -  "missing expression"
*Cause:    
*Action:
Error at Line: 112 Column: 24 

当我执行这段代码时

select * 
  from sds.input_control 
 where effective_date between Date TO_DATE(:StartDate) and Date TO_DATE(:EndDate) 

有人可以向我解释为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

  • 您需要to_date的格式,例如 to_date(:EndDate,'yyyy-mm-dd')
  • 在您的情况下,关键字Datebetween之间的to_date限定词不存在。此外,Date是保留关键字,不能用作Oracle's SQL的列名。

答案 1 :(得分:0)

select * 
from sds.input_control
where effective_date between Date TO_DATE(:StartDate) and Date TO_DATE(:EndDate) 
                             ????                         ????

这是什么“约会”的事?删除它。

如果要提供字符串作为StartDate和EndDate,例如,为TO_DATE函数提供适当的格式掩码。 to_Date(:startdate, 'dd.mm.yyyy')。不要依赖Oracle的隐式转换。

整个查询看起来像

select * 
from sds.input_control 
where effective_date between TO_DATE(:StartDate, 'dd.mm.yyyy') and 
                             TO_DATE(:EndDate  , 'dd.mm.yyyy') 

答案 2 :(得分:0)

您发布的代码试图将字符串两次转换为日期。

DATE文字和TO_DATE相似的作业,并在调用时返回datetime数据类型。从文档(https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm):

  

要将DATE值指定为文字,必须使用Gregorian   日历。您可以指定一个ANSI文字,如以下示例所示:

     

DATE '1998-12-25'

     

ANSI日期文字不包含时间部分,并且   必须以“ YYYY-MM-DD”格式指定。或者,您可以   指定一个Oracle日期值,如以下示例所示:

     

TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI')

     

默认日期格式   Oracle DATE值由初始化参数指定   NLS_DATE_FORMAT。

删除DATE或TO_DATE使其生效。还应考虑到,如果:StartDate和:EndDate中的字符串具有时间成分(小时/分钟/秒),则DATE文字不支持它,因此您需要TO_DATE。

此外,建议使用TO_DATE时在字符串中显式设置日期格式。这样,如果将来有人更改NLS_DATE_FORMAT参数,您的应用程序将不会中断并停止工作。

话虽如此,最常见的解决方案可能是:

select * 
  from sds.input_control 
 where effective_date between TO_DATE(:StartDate, 'YYYY-MM-DD HH24:MI:SS') and TO_DATE(:EndDate, 'YYYY-MM-DD HH24:MI:SS') 

或根据进入这些变量的varchar2数据相应地调整格式掩码。