几年前我听说在 sql 中截断日期不是一个好的做法。这是真的吗?
我需要从“yyyy-MM-dd”格式的表中获取日期类型列的值,该日期当前以“yyyy-MM-dd hh:mm:ss”格式存储在表中
在正确的情况下使用
date_trunc
并没有什么问题。
主要问题是哪里涉及到b树索引。如果您在
some_timestamp
上有索引并且搜索 date_trunc('day', some_timestamp) = DATE '2012-01-01'
,则 PostgreSQL 无法使用该索引。
(理论上它可以将
date_trunc
表达式重写为可索引范围谓词,但事实并非如此)。
如果你改为写:
some_timestamp >= DATE '2012-01-01' AND some_timestamp < DATE '2012-01-02'
然后它是可索引的 B 树。 (请注意,我故意不使用
BETWEEN
,因为它包含两者)。
创建表达式索引有时很有用,例如
create index blahindex on blahtable (date_trunc('day', some_timestamp));
但由于每个额外的索引都有维护成本,因此最好只编写谓词,以便尽可能轻松地与普通列索引一起使用。
以 任何 类型的格式存储它都是不好的做法,因为您应该将其存储为
timestamp
或 timestamp with time zone
,而不是 text
或 varchar
。
然后,要获取日期,只需投射:
SELECT col::date
请注意,“日期”取决于您当前的时区设置。
参见: