我收到此错误
"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)
有人可以向我解释为什么会这样吗?
答案 0 :(得分:1)
to_date
的格式,例如
to_date(:EndDate,'yyyy-mm-dd')
Date
和between
之间的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数据相应地调整格式掩码。