Sql 用于比较日期的AM-PM冲突

Sql 用于比较日期的AM-PM冲突,sql,postgresql,datetime,timestamp,between,Sql,Postgresql,Datetime,Timestamp,Between,在这里,我有一个查询,它显示datetime字段作为比较两个datetime字段的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:0

在这里,我有一个查询,它显示datetime字段作为比较两个datetime字段的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下午”)

上述查询返回的数据很好,但如果我将第一个日期的时间戳从“20/05/2013 04:31:22 am”更改为“20/05/2013 06:31:22 am”,则返回空值


我不知道为什么会发生这种情况。

不要将日期时间字段转换为字符。相反,请将这两个字符串转换为datetime对象,并按如下方式构造查询:

where req.created_on >= your first datetime object
and req.create_on < 1 second after your second datetime object
where req.created\u on>=您的第一个datetime对象
和req.create_在第二个datetime对象之后<1秒

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

所以


(这是因为
between
子句正在比较两个字符串)

您应该对常量而不是列进行转换:

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')


虽然这看起来更麻烦,但它在性能上有一个关键优势。不,优势不在于将每行上的日期转换为字符串的开销(尽管有一些好处)。在上创建的请求周围缺少函数调用意味着可以为查询考虑索引。将其包装在函数中通常会阻止使用索引。

这里的第一个日期和最后一个日期来自服务器端。所以它们是字符串,用于比较。来自哪个服务器端?有没有一个.net、coldfusion、php之类的应用程序你没有提到?如果是这样,您不能从该应用程序发送datetime对象而不是字符串吗?另外,正如Gordon提到的,postgresql有一个to_date()函数,您可以在必要时使用。请帮助将12小时格式的字符串日期转换为不带时区的时间戳。这里的第一个日期和最后一个日期来自服务器端。所以他们是字符串的,来进行比较。我也尝试过这个方法,在日期时间对象之间切换通常会导致您在日期时间结束时或结束时丢失数据。@DanBracuk这是Postgres的怪癖吗?@Gokul你是说您发布的查询与您遇到的问题不完全一样吗?@HughJones,这不是Postgres的怪癖,这只是日期时间的方式。你是如何更改时间戳的?从四点半到六点半?@HughJones这些搜索条件日期。由最终用户提供。正如您所说,我使用to_date()检查了两个日期,在这两个日期之间,数据库中不存在任何日期。但它仍然返回值。@HughJones可以帮助将12小时格式的字符串日期转换为不带时区的时间戳。to_date('20/05/2013 04:31:22 am','DD/MM/YYYY HH:MI:SS am'),正如Gordon在下面建议的那样。。。测试它,因为我是从memoryto_date()开始工作的,不会检查时间戳。只需要几天时间?但是我想比较时间戳和日期,包括上午和下午。它将检查整个日期时间。任何人都可以帮助将12小时格式的字符串日期转换为不带时区的时间戳。@Gokul只需将上面的答案中的
更改为\u date
@ClodoaldoNeto我尝试过这样做从事件中选择时间戳('20/05/2013 08:00:00 pm','dd/mm/yyyy hh24:mi:ss'),而不是像“2013-05-20 20:00:00+05:30”这样给出结果,就像这样给出“2013-05-20 08:00:00+05:30”
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')