选择日期字段介于两个日期之间的两个日期之间的数据

时间:2014-05-20 18:31:03

标签: sql oracle

我发出以下查询,但遇到错误:无效月份。求救!

SELECT * FROM TABLE1
WHERE Field1 = '12345' AND
      TO_DATE('4/28/2014 12:00:00 AM') BETWEEN TO_DATE(DATE1) AND TO_DATE(DATE2);

由于

2 个答案:

答案 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;

假设 DATE1DATE2已经是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了解更多信息(如果您还没有)。有格式掩码可以帮助定义字符串,以防将来进行更改。