0

在这里,我有一个查询,它显示日期时间字段作为结果以及比较两个日期时间字段的 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 am ”更改为“ 20/05/2013 06:31:22 am ”,则返回 null。

我不知道为什么会这样。

4

3 回答 3

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意味着可以为查询考虑索引。将其包装在函数中通常会排除索引的使用。

于 2013-05-28T13:38:38.773 回答
0

您需要取出to_char,我建议您参数化输入日期

所以

  req.created_on Between :FirstDate and :SecondDate

(发生这种情况是因为该between子句正在比较两个字符串)

于 2013-05-28T13:29:30.943 回答
0

不要将您的日期时间字段转换为字符。相反,将这两个字符串转换为日期时间对象并像这样构造您的查询:

where req.created_on >= your first datetime object
and req.create_on < 1 second after your second datetime object
于 2013-05-28T13:26:32.913 回答