我发出以下查询,但遇到错误:无效月份。求救!
SELECT * FROM TABLE1
WHERE Field1 = '12345' AND
TO_DATE('4/28/2014 12:00:00 AM') BETWEEN TO_DATE(DATE1) AND TO_DATE(DATE2);
由于
答案 0 :(得分:4)
您需要指定日期转换的格式掩码。看起来NLS_DATE_FORMAT
可能是DD/MM/YYYY
,有或没有时间部分。您以不同的格式传递日期。您永远不应该依赖NLS设置,在查询中提供TO_DATE()
的格式掩码:
SELECT *
FROM TABLE1
WHERE Field1 = '12345'
AND TO_DATE('4/28/2014 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM')
BETWEEN DATE1 AND DATE2;
我假设 DATE1
和DATE2
已经是DATE
类型,在这种情况下无需调用{{1} }};所有这一切都是使用TO_DATE
将它们转换为字符串并从字符串返回,这可能是无意义的,或者与NLS_DATE_FORMAT
相同,具体取决于设置方式。
当然,您在此处使用的日期是午夜,因此指定时间不是添加任何内容;如果你永远不会有领带部分,那么你可以做任何一个:
TRUNC()
或
AND TO_DATE('4/28/2014', 'MM/DD/YYYY') BETWEEN DATE1 AND DATE2;
如果AND DATE '2014-04-28' BETWEEN DATE1 AND DATE2;
是数字,那么您也不应该在field1
附近引用,您只需添加隐式12345
。
但如果你将数字和/或日期存储为字符串,你应该再考虑一下。希望事实上这不是你正在做的......
答案 1 :(得分:0)
TO_DATE的月数需要为两位数,因此您需要:
SELECT * FROM TABLE1 WHERE Field1 = '12345' AND TO_DATE('04/28/2014 12:00:00 AM') BETWEEN TO_DATE(DATE1) AND TO_DATE(DATE2);
参考http://www.techonthenet.com/oracle/functions/to_date.php了解更多信息(如果您还没有)。有格式掩码可以帮助定义字符串,以防将来进行更改。