AM - PM冲突用于比较日期

时间:2013-05-28 13:13:04

标签: sql postgresql datetime timestamp between

这里我有一个查询,显示日期时间字段作为结果,其中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。

我不知道为什么会这样。

3 个答案:

答案 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子句正在比较两个字符串)