PostgreSQL 按时间戳过滤

Far*_*ıcı 6 sql database postgresql timestamp

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

在此输入图像描述

有哪些类型,

在此输入图像描述

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

例如,以下代码有效,并且 SQL 管理器显示“2 行受影响”;

UPDATE report SET picked_count = 10 WHERE order_id = 168366
Run Code Online (Sandbox Code Playgroud)

但是,我正在尝试按order_id和进行过滤start_picking_hour。我不确定如何按 类型进行过滤timestamp。我尝试过的以下查询均无效。每个都返回一条消息“0 rows受影响”。

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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

Atimestamp还包含小数秒(毫秒)。像您使用的 ( ) 这样的时间戳文字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'
Run Code Online (Sandbox Code Playgroud)

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

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

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