几年前我听说在sql中截断日期不是一个好习惯。这是真的吗?
我需要从“yyyy-MM-dd”格式的表中获取日期类型列的值,日期当前存储在具有“yyyy-MM-dd hh:mm:ss”格式的表中
答案 0 :(得分:4)
以 任何 格式存储它是不好的做法,因为您应该将其存储为timestamp
or timestamp with time zone
而不是text
或{{ 1}}
然后,为了得到日期,只需施放:
varchar
请注意,“日期”取决于您当前的时区设置。
更多:
答案 1 :(得分:3)
在适当的情况下使用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-tree可索引的。 (请注意,我故意不使用BETWEEN
,因为它包含两者兼而有之。)
创建表达式索引有时很有用,例如
create index blahindex on blahtable (date_trunc('day', some_timestamp));
但是由于每个额外索引都有维护成本,因此最好只编写谓词,以便在可能的情况下使用普通列索引轻松使用。