所以我在Oracle中遇到了一个奇怪的事情,我有以下SQL语句。
Select *
From tblApplicationMessage
Where cntApplicationMessageType = 1
AND ysnActive = 1
AND (dtmValidStart IS NULL OR dtmValidStart <= '09 Nov 2017')
ORDER BY cntApplicationMessage desc;
传递日期为2017年11月9日&#39;。目前的日期是一样的。显然,这两者应该等同于&#34; =&#34; SQL的一部分。
如果真的这样,我应该从我的DB收到13条记录(今天输入了一条记录(&#39; 2017年11月9日和#39;))。相反,我收到12条记录,而今天找不到的记录。
当我将格式更改为使用to_date时,我收到了类似的问题,即使在回拨到2017年11月8日23:59:59&#39;。
我的问题很简单:有没有更好的方法在Oracle中进行日期比较?
更新:似乎有些人不擅长阅读并继续建议我使用to_date进行比较。让我再次(我以前曾说过)就在这里,这样他们就可以得到关于我所说的......
我尝试使用to_date进行比较。每当我这样做,我仍然没有得到我预期的结果。相反,我仍会收到12条记录。
即使在将日期回滚到to_date(&#39; 08年11月17日23:59:59&#39;,&#39; dd yyhh24:mi:ss&#39;)之后,它仍然无效。我将日期进一步推迟到11月1日,但仍然没有做任何事情。
我终于放弃了这一尝试,因为它没有用。
最后的想法,因为我现在已经看过这两三次了:
使用to_date DID NOT WORK!不要太粗鲁,但是在它没有工作之前说过两三次之后,我会认为其他人会接受这样的事实: #39;在这种情况下为我工作......
什么工作并被接受为答案是使用TRUNC。它让我得到了我想要的结果。我会注意找到一个更好的解决方案,但它现在正是它的工作原理。
答案 0 :(得分:1)
如果您查询:
select * from SYS.NLS_SESSION_PARAMETERS
您会看到日期格式包含日期和时间,例如:
'DD-MM-YYYY HH24:MI:SS'
所以'2017年11月09日'将相当于09-11-2017 00:00:00。比较日期时,您提供的值将隐式转换为包含时间的格式。您应该在查询时考虑到这一点,或者例如在比较日期列时使用TRUNC函数。