检索postgresql之间的时间戳

时间:2013-06-24 06:56:31

标签: postgresql datetime timestamp

select 
  to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') >= 
  to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh:mi:ss a') 
  and 
  to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') <= 
  to_timestamp('2013-06-24 11:50:00 AM', 'yyyy-MM-dd hh:mi:ss a') as a;

是真的,但是:

select 
  to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') >=
  to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh:mi:ss a') 
  and 
  to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') <= 
  to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss a') as a

结果是假的

请解决..

2 个答案:

答案 0 :(得分:2)

你需要使用“am”或“pm”而不是“a”作为12小时的说明符。

to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss am')

解决这个问题是一个简单的过程。您从第二个查询中获得意外的“错误”。因此,您分别评估每个分支以查看哪个分支是错误的:

regress=> select 
regress->   to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') >=
regress->   to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh:mi:ss a');
 ?column? 
----------
 t
(1 row)

regress=> select   to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') <= 
regress->   to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss a') as a;
 a 
---
 f
(1 row)

好的,所以它是意外不匹配的第二个。时间戳看起来应该与条件匹配,所以让我们看看每个to_timestamp函数的输出

regress=> select to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a'), 
  to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss a');
      to_timestamp      |      to_timestamp      
------------------------+------------------------
 2013-06-24 11:36:40+08 | 2013-06-24 00:50:00+08
(1 row)
嗯,你看看那个吗? 12:50变成了00:50。 12小时的偏移表明PM未被识别。我们来看看the documentation

  • AM, am, PM or pm meridiem指标(没有句点)

看起来您想要ampm,而不仅仅是a,就像您在所使用的时间模式中所写的那样。让我们用更正后的指标来尝试:

regress=> select to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss am');
       to_timestamp      
------------------------
 2013-06-24 12:50:00+08
(1 row)

那就做到了。将其反馈到原始查询中....

select 
  to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss am') >=
  to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh:mi:ss am') 
  and 
  to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss am') <= 
  to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss am') as a

...按预期返回true。所以,你去,这是解决问题101的步骤。

答案 1 :(得分:1)

我检查了您发布的以下查询,发现to_timestamp函数返回以下结果进行比较。

-----查询下面返回0(即错误)-----

select to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') >= to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh:mi:ss a') and to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh:mi:ss a') <= to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh:mi:ss a')as a


---以下是比较的条件 -
第一个要比较的条件(返回True)  to_timestamp('2013-06-24 11:36:40 AM','yyyy-MM-dd hh:mi:ss a') - &gt; 2013年6月24日10:36:40 + 0000  to_timestamp('2013-06-24 11:20:00 AM','yyyy-MM-dd hh:mi:ss a') - &gt; 2013年6月24日10:20:00 + 0000


---要比较的第二个条件(返回false) -
 to_timestamp('2013-06-24 11:36:40 AM','yyyy-MM-dd hh:mi:ss a') - &gt; 2013年6月24日10:36:40 + 0000  to_timestamp('2013-06-24 12:50:00 PM','yyyy-MM-dd hh:mi:ss a') - &gt; 2013年6月23日23:50:00 + 0000


正如您所注意到的那样,第二个条件将2013年6月24日与2013年6月23日比较为假。

尝试使用以下返回True结果的查询
/ ---下面的查询返回1(ieTrue)---- /

select to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh24:mi:ss a')
>= to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh24:mi:ss a') 
and to_timestamp('2013-06-24 11:36:40 AM', 'yyyy-MM-dd hh24:mi:ss a')
<= to_timestamp('2013-06-24 12:50:00 PM', 'yyyy-MM-dd hh24:mi:ss a')as a

在上面的查询中我使用24Hr格式进行比较。(yyyy-MM-dd hh24:mi:ss)

我在http://sqlfiddle.com/

上测试了结果

我希望这会对你有所帮助。

由于 Jignesh