PostgreSQL按时间戳过滤

时间:2015-02-17 12:14:27

标签: sql database postgresql timestamp

我有一个名为report的表,如下所示;

enter image description here

的类型

enter image description here

此处我尝试更改按order_idstart_picking_hour过滤的行。 order_id没有问题。但是,当我按start_picking_hour过滤时,我无法实现任何目标。

例如,以下代码有效,SQL Manager说“2行受影响”;

UPDATE report SET picked_count = 10 WHERE order_id = 168366

但是,我正在尝试按order_idstart_picking_hour进行过滤。我不确定如何按timestamp类型进行过滤。我尝试过的以下查询都没有。每个人都返回了“0行受影响”的消息。

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = TO_TIMESTAMP('2/17/2015 10:12:51 AM','dd-mm-yyyy hh12:mi:ss')

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = TO_TIMESTAMP('2/17/2015 10:12:51','dd-mm-yyyy hh12:mi:ss')

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = TO_TIMESTAMP('2/17/2015 10:12:51 AM','dd-mm-yyyy hh:mi:ss')

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = TO_TIMESTAMP('2/17/2015 10:12:51','dd-mm-yyyy hh:mi:ss')

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = '2/17/2015 10:12:51 AM'

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = 2/17/2015 10:12:51 AM

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = '2/17/2015 10:12:51'

UPDATE report SET picked_count = 10 WHERE order_id = 168366 and
      start_picking_hour = 2/17/2015 10:12:51

timestamp子句中按WHERE过滤的确切方法是什么?我正在使用PostgreSQL。

1 个答案:

答案 0 :(得分:2)

timestamp还包含小数秒(毫秒)。您正在使用的时间戳文字(TO_TIMESTAMP('2/17/2015 10:12:51 AM','dd-mm-yyyy hh12:mi:ss'))不包含毫秒。

您可以使用date_trunc()函数从时间戳值中“删除”毫秒(它们不会被“删除” - 只需设置为零):

where date_trunc('second', start_picking_hour) = timestamp '2015-02-17 10:12:51'

(我更喜欢to_timestamp()上的ANSI时间戳文字,因为它们写得更短,可移植且更明确)

请注意,这将阻止在start_picking_hour列上使用索引。

如果您不关心毫秒,则可以将列定义为timestamp(0)。在这种情况下,永远不会存储毫秒,您可以直接将列与时间戳文字(不包含毫秒)进行比较。在这种情况下,可以使用该列的索引