oracle 数据库的 TO_CHAR 和 TO_DATE的一些用法总结
做了一个功能是以起始时间和截止时间的区间为条件查询数据语句如下:
SELECT createdtime FRoM noticeinfo
WHERE noticeinfo.CREATEDTIME, ‘yyyy-mm-dd‘ >= "TO_DATE"(#{starttime},yyyy-mm-dd‘)
and noticeinfo.CREATEDTIME, ‘yyyy-mm-dd‘ <= "TO_DATE"(#{endtime},yyyy-mm-dd‘)
结果发现当起始时间和截止时间相同时不能查出数据,原因是starttime和endtime时间格式只有年月日,而CREATEDTIME的时间格式是年月日时分秒,这样CREATEDTIME和
endtime年月日相同时,CREATEDTIME却多出时分秒,这样使CREATEDTIME大于endtime,进而不符合条件,所以查不到数据。当把CREATEDTIME的时分秒都设置成零时可以
查到,到这并不是我想要的。
解决方案一:使用TO_CHAR()方法截取CREATEDTIME的年月日再做比较
SELECT createdtime FRoM noticeinfo
WHERE to_char(noticeinfo.CREATEDTIME, ‘yyyy-mm-dd‘) >= "TO_DATE"(#{starttime},‘yyyy-mm-dd‘)
and to_char(noticeinfo.CREATEDTIME, ‘yyyy-mm-dd‘) <= "TO_DATE"(#{endtime},‘yyyy-mm-dd‘)
但是这样语句报错因为TO_CHAR()方法虽然截取了年月日,却把日期变成了字符串,不能和日期进行比较。
解决方案二:最后再使用TO_DATE()方法把字符串转成时间格式
SELECT createdtime FRoM noticeinfo
WHERE "TO_DATE"(to_char(noticeinfo.CREATEDTIME, ‘yyyy-mm-dd‘), ‘yyyy-mm-dd‘) >= "TO_DATE"(#{starttime},‘yyyy-mm-dd‘)
and "TO_DATE"(to_char(noticeinfo.CREATEDTIME, ‘yyyy-mm-dd‘), ‘yyyy-mm-dd‘) <= "TO_DATE"(#{endtime},‘yyyy-mm-dd‘)