几年前,我听说在 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'
Run Code Online (Sandbox Code Playgroud)
那么它是可索引的 B 树。(请注意,我故意不使用,BETWEEN因为它是包含两者的)。
创建表达式索引有时很有用,例如
create index blahindex on blahtable (date_trunc('day', some_timestamp));
Run Code Online (Sandbox Code Playgroud)
但由于每个额外的索引都有维护成本,因此最好只编写谓词,以便尽可能轻松地与普通列索引一起使用。
以任何格式存储它都是不好的做法,因为您应该将其存储为timestamp或timestamp with time zone不存储为text或varchar。
然后,要获取日期,只需投射:
SELECT col::date
Run Code Online (Sandbox Code Playgroud)
请注意,“日期”取决于您当前的时区设置。
看:
| 归档时间: |
|
| 查看次数: |
1921 次 |
| 最近记录: |