首页 > 解决方案 > 在带有时间戳列的 postgresql 中使用 select 命令时的混淆

问题描述

我有这样的结构表。

CREATE TABLE users (
    id serial NOT NULL,
    created_at timestamp NOT NULL
    )

我在这个表中有超过 1000 条记录。这是我的第一个查询。

1 个查询

select id,created_at from users where id in  (1051,1052)

在此处输入图像描述

这将返回两行,正如预期的那样正确。但是,当我使用

第二次查询

select id,created_at from users where  created_at = '2020-06-28'

或者

select id,created_at from users where  created_at = date '2020-06-28'

它什么也不返回,这不是预期的结果,因为它应该返回两行。

在此处输入图像描述

同样,如果我使用这个

第三个查询

select id, created_at from users where created_at between date '2020-06-28' and date '2020-06-28' 

它什么也不返回,但是我认为这也应该返回两行。

在此处输入图像描述

虽然这

第 4 个查询

select id, created_at from users where created_at between date '2020-06-28' and date '2020-06-29'

返回两行。 在此处输入图像描述

显示时区返回我当前所在的正确时区

在此处输入图像描述

我不明白这一点,为什么第二次,第三次和第四次查询的结果不同。如何使用第三个查询获得与查询 1 相同的结果。

标签: postgresql

解决方案


您所有查询的一个原因是您正在timestampdate

查询 2

您正在比较2020-06-28 13:02:53 = 2020-06-28 00:00:00哪个不匹配,因此不返回任何记录。

查询 3

您正在使用不匹配的betweenie 2020-06-28 13:02:53 between 2020-06-28 00:00:00 and 2020-06-28 00:00:00,因此不返回任何记录。

查询 4

您正在使用betweenie 2020-06-28 13:02:53 between 2020-06-28 00:00:00 and 2020-06-29 00:00:00。在这里,两条记录都落在那些时间戳中,您正在获取记录

所以你必须比较日期值。由于右操作数是date类型值,因此您必须将左操作数转换为date. 试试这个

第二次查询

select id,created_at from users where  date(created_at) = '2020-06-28'

第三次查询

select id, created_at from users where date(created_at) between date '2020-06-28' and date '2020-06-28'

如果要比较日期范围,则应选择第三种方法。只有一天,您应该使用第二个查询。


推荐阅读