ToDate函数未按预期返回

时间:2019-03-27 19:12:32

标签: oracle

我正在过滤日期类型为ETD_Date的数据库。我的过滤器是

AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 12:00:00','MM/DD/YYYY 
  HH:MI:SS AM') AND TO_DATE('3/11/2019 11:59:59','MM/DD/YYYY HH:MI:SS PM')

它返回了我零行,但是当我检查我的表时,我确实有  “ 3/11/2019 5:00:00 PM”和“ 3/11/2019 7:45:00 PM”。我尝试将AM / PM交换为

 OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 12:00:00','MM/DD/YYYY HH:MI:SS PM') AND TO_DATE('3/11/2019 11:59:59','MM/DD/YYYY HH:MI:SS AM') 

购买它将无法正常工作。我的过滤器应该是什么,以便获得预期的结果。

1 个答案:

答案 0 :(得分:1)

AMPM也必须出现在日期字符串中。如

AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM')
                     AND TO_DATE('3/11/2019 11:59:59 PM','MM/DD/YYYY HH:MI:SS PM')

上面的建议您习惯使用24小时制也是您应该做的事情。因此,尝试:

AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 00:00:00','MM/DD/YYYY HH24:MI:SS')
                     AND TO_DATE('3/11/2019 23:59:59','MM/DD/YYYY HH24:MI:SS')

或者您可以在大部分时间忽略时间:

AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019','MM/DD/YYYY')
                     AND TO_DATE('3/12/2019','MM/DD/YYYY') - INTERVAL '1' SECOND

后一种版本之所以有用,是因为DATE的时间部分(如果未指定)默认为00:00:00,并且从午夜减去一秒钟便得到23:59:59

好运。