为什么我需要对每个时间戳进行类型转换?

Why do I need to typecast every timestamp?

我正在将 PostgreSQL 12.6 与 TimescaleDB 一起使用,并且我有一个带有“时间”字段的 hypertable:

"time" timestamp without time zone NOT NULL

当我尝试使用“时间”时,我需要像这样对其进行类型转换。

SELECT COUNT(*) FROM raws WHERE "time"::date BETWEEN '2016-04-19 15:16:00' AND '2021-04-19 15:16:00'

问题是我正在处理现有的代码库,而我的同事不需要进行类型转换。这是我缺少的设置,还是我们真的需要进行类型转换?

编辑: 我忘了说 table 是一个 hypertable。 我从转储中导入了所有数据,这是我为“时间”获得的数据之一:

2021-04-08 00:00:00

带强制转换的查询得到了大约一百万个结果,但没有强制转换我得到了 0 个结果。

我试图重新索引 hypertable 但我得到了这个 :

REINDEX TABLE raws;
ERROR:  chunk not found

转换为 date 后,PostgreSQL 会将字符串文字 '2021-04-19 15:16:00' 转换为 date 以匹配左侧的数据类型。结果,小时、分钟和秒被丢弃。

有关详细参考,请参阅 type conversion rules for functions

因此似乎有 "time" 等于 2016-04-19 00:00:00 的行,但是 none 与 2016-04-19 15:16:00.