PostgreSQL 按时间戳过滤
PostgreSQL filter by timestamp
我有一个名为 report
的 table,如下所示;
有哪些类型,
我在这里尝试更改按 order_id
和 start_picking_hour
过滤的行。 order_id
没有问题。但是,当我按 start_picking_hour
.
过滤时,我什么也做不了
例如,以下代码有效,SQL经理说“2 行受影响”;
UPDATE report SET picked_count = 10 WHERE order_id = 168366
但是,我正在尝试按 order_id
和 start_picking_hour
进行过滤。我不确定如何按 timestamp
类型进行过滤。 None 我试过的以下查询都有效。每个人都返回一条消息“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
在 WHERE
子句中按 timestamp
过滤的确切方法是什么?我正在使用 PostgreSQL.
A timestamp
还包含小数秒(毫秒)。像您正在使用的时间戳文字 (TO_TIMESTAMP('2/17/2015 10:12:51 AM','dd-mm-yyyy hh12:mi:ss')
) 不包含毫秒。
您可以使用 date_trunc()
函数 "remove" 时间戳值的毫秒数(它们不是 "removed" - 只是设置为零):
where date_trunc('second', start_picking_hour) = timestamp '2015-02-17 10:12:51'
(与 to_timestamp()
相比,我更喜欢 ANSI 时间戳文字,因为它们写起来更短、可移植且明确)
请注意,这将阻止在 start_picking_hour 列上使用索引。
如果您不关心毫秒数,则可以将列定义为 timestamp(0)
。在这种情况下,将永远不会存储毫秒,您可以将该列直接与时间戳文字(不包含毫秒)进行比较。在那种情况下,可以使用该列 上的索引 。
我有一个名为 report
的 table,如下所示;
有哪些类型,
我在这里尝试更改按 order_id
和 start_picking_hour
过滤的行。 order_id
没有问题。但是,当我按 start_picking_hour
.
例如,以下代码有效,SQL经理说“2 行受影响”;
UPDATE report SET picked_count = 10 WHERE order_id = 168366
但是,我正在尝试按 order_id
和 start_picking_hour
进行过滤。我不确定如何按 timestamp
类型进行过滤。 None 我试过的以下查询都有效。每个人都返回一条消息“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
在 WHERE
子句中按 timestamp
过滤的确切方法是什么?我正在使用 PostgreSQL.
A timestamp
还包含小数秒(毫秒)。像您正在使用的时间戳文字 (TO_TIMESTAMP('2/17/2015 10:12:51 AM','dd-mm-yyyy hh12:mi:ss')
) 不包含毫秒。
您可以使用 date_trunc()
函数 "remove" 时间戳值的毫秒数(它们不是 "removed" - 只是设置为零):
where date_trunc('second', start_picking_hour) = timestamp '2015-02-17 10:12:51'
(与 to_timestamp()
相比,我更喜欢 ANSI 时间戳文字,因为它们写起来更短、可移植且明确)
请注意,这将阻止在 start_picking_hour 列上使用索引。
如果您不关心毫秒数,则可以将列定义为 timestamp(0)
。在这种情况下,将永远不会存储毫秒,您可以将该列直接与时间戳文字(不包含毫秒)进行比较。在那种情况下,可以使用该列 上的索引 。