使用date_trunc的缺点

时间:2014-09-19 13:50:37

标签: sql postgresql

几年前我听说在sql中截断日期不是一个好习惯。这是真的吗?

我需要从“yyyy-MM-dd”格式的表中获取日期类型列的值,日期当前存储在具有“yyyy-MM-dd hh:mm:ss”格式的表中

2 个答案:

答案 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));

但是由于每个额外索引都有维护成本,因此最好只编写谓词,以便在可能的情况下使用普通列索引轻松使用。