日期:2014-05-17  浏览次数:20716 次

一个SQL比较日期的奇怪问题
SELECT count(*) FROM Alert where '2012-04-30'<= firstTime

上面的语句执行没有问题


  SELECT count(*) FROM Alert where '2012-04-30'<= firstTime and firstTime <= '2012-05-07'

当多加一个条件的时候 报错 无效的月份 



请问这是为什么

------解决方案--------------------
firstTime什么类型?
------解决方案--------------------
SQL code
select 1 from dual where to_date(20120430,'yyyymmdd')<=sysdate and sysdate<=to_date(20120508,'yyyymmdd');

------解决方案--------------------
这样呢?
SQL code

SELECT count(*) FROM Alert where date'2012-04-30'<= firstTime and firstTime <= date'2012-05-07'

------解决方案--------------------
表达式的两边,一边是字符串,一边是时间类型,不能直接比较。如果看执行计划,你就可以看到进行了什么样的隐式转换了
隐式转换使用了如下的时间格式
select * from nls_session_parameters where parameter='NLS_DATE_FORMAT';
很明显,你用的字符串格式和它不一致
------解决方案--------------------
我在想 一个时间类型和 '2012-04-30'这个比较不会报错么?

'2012-04-30'不会自动转换成时间类型 应该会报错日期无效吧
------解决方案--------------------
很奇怪的语法,不过,倒也说明了oracle的自行处理逻辑。
这种错,别人还真不太好犯,希望楼主多多犯错,让大家多多学习。