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

结果是假的

请解决它..

4

2 回答 2

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没有被识别。让我们看一下文档

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

看起来你想要amor pm,而不是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。

于 2013-06-24T07:31:22.623 回答
1

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

-----下面的查询返回 0 (ieFalse)-----

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') -->2013 年 6 月 24 日 10:36:40+0000 to_timestamp('2013-06-24 11:20:00 AM', 'yyyy-MM-dd hh:mi:ss a')-->6 月 24 日2013 10:20:00+0000


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


如您所见,这里的第二个条件将 2013 年 6 月 24 日与 2013 年 6 月 23 日进行比较,返回 false。

Try below Query which return True result
/---Below query returns 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

于 2013-06-24T07:30:43.637 回答