使用date_trunc的缺点

问题描述 投票:0回答:2

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

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

sql postgresql
2个回答
6
投票

在正确的情况下使用

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

但由于每个额外的索引都有维护成本,因此最好只编写谓词,以便尽可能轻松地与普通列索引一起使用。


5
投票

任何 类型的格式存储它都是不好的做法,因为您应该将其存储为

timestamp
timestamp with time zone
,而不是
text
varchar

然后,要获取日期,只需投射:

SELECT col::date

请注意,“日期”取决于您当前的时区设置。

参见:

© www.soinside.com 2019 - 2024. All rights reserved.