这里我有一个查询,显示日期时间字段作为结果,其中where条件比较两个日期时间字段。
SELECT req.created_on
FROM incident req
WHERE to_char(req.created_on ,'dd/mm/yyyy hh:mi:ss am')
BETWEEN '20/05/2013 04:31:22 am' AND '23/05/2013 04:31:27 pm'
数据库中的数据存储是“ 2013-05-20 17:43:04(”2013-05-20 05:43:04 pm“)”。
以上查询返回数据正常但如果我将第一个日期的时间戳从“ 20/05/2013 04:31:22上午”更改为“ 20/05/2013 06 :31:22 am '它返回null。
我不知道为什么会这样。
答案 0 :(得分:1)
您应该对常量进行转换,而不是列:
SELECT req.created_on
FROM incident req
WHERE req.created_on
BETWEEN to_date('20/05/2013 04:31:22 am', 'dd/mm/yyyy hh:mi:ss am') AND
to_date('23/05/2013 04:31:27 pm', 'dd/mm/yyyy hh:mi:ss am')
虽然这看起来更麻烦,但它在性能方面具有关键优势。不,优点不是在每一行上将日期转换为字符串的开销(尽管那里有一些收益)。 req.created_on
周围缺少函数调用意味着可以为查询考虑索引。将其包含在函数中通常会妨碍使用索引。
答案 1 :(得分:0)
请勿将日期时间字段转换为字符。相反,将这两个字符串转换为datetime对象并构建您的查询,如下所示:
where req.created_on >= your first datetime object
and req.create_on < 1 second after your second datetime object
答案 2 :(得分:0)
您需要取出to_char
,我建议您参数化输入日期
所以
req.created_on Between :FirstDate and :SecondDate
(这是因为between
子句正在比较两个字符串)