postgresql - 在带有时间戳列的 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 相同的结果。
解决方案
您所有查询的一个原因是您正在timestamp
与date
在查询 2
您正在比较2020-06-28 13:02:53 = 2020-06-28 00:00:00
哪个不匹配,因此不返回任何记录。
在查询 3
您正在使用不匹配的between
ie 2020-06-28 13:02:53 between 2020-06-28 00:00:00 and 2020-06-28 00:00:00
,因此不返回任何记录。
在查询 4
您正在使用between
ie 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'
如果要比较日期范围,则应选择第三种方法。只有一天,您应该使用第二个查询。
推荐阅读
- git - Gitflow /删除每个分支中的目录
- python - 如何在多标签分类问题中将自定义权重传递给 scikit_learn 包装器(例如 KerasClassifier)
- python - 用于神经网络训练的掩码
- appium - 带有 Selenium Grid 的 Appium 导致 - GridException:无法从请求中提取功能
- r - 生存分析中的 NTWCO 数据集解释?
- javascript - Next.js - 警告:道具 `dangerouslySetInnerHTML` 不匹配
- php - 选择填充但不显示值 (php/msqli)
- firebase - Firebase - 是否可以在 Firebase Spark 计划中使用第三方服务提供商
- swift - 带有表单的 SwiftUI 模态表:设备旋转后左/右填充错误
- c# - Unity:如何创建陆地事件 c#