在 Postgresql 中比较字符串日期的最有效方法?

Most Efficient Way to Compare String Dates in Postgresql?

我们在 AWS(引擎版本 11.8)上有一个 PostgreSQL 数据库 运行。
对于每个项目,我们将日期存储为字符串 [varchar 类型](格式如下 - '2020-12-16')
我们的应用程序需要进行日期范围查询。基于此,在 PostgreSQL 中进行字符串日期比较的最佳和最有效的方法是什么?
我在这里查看了几个关于 SO 的问题,但是没有人讨论将日期存储为“varchar”类型或“date”类型是否存在差异的问题。
同样基于上述 2 种存储类型,最有效的查询方式是什么?特别是我们正在考虑查询范围(例如从“2020-12-10”和“2020-12-16”开始)
非常感谢您的反馈

no one talks about the question if there is a difference to store the dates as type "varchar" or type "date".

修复您的数据模型!您应该使用正确的数据类型来存储数据:日期应存储为 date。使用错误的数据类型是错误的,原因有很多:

  • 每当你需要做日期运算时,你需要将你的字符串转换为日期(例如:你如何将一个月添加到 string '2020-12-16'?);这是非常低效的

  • 在存储您的数据时无法强制执行数据完整性;即使使用检查约束也是不够的。例如:如何判断 '2021-02-29' 是否是有效日期?

what would be the most efficient way to do queries? In particular we are looking at querying for ranges.

也就是说,您使用的格式可以进行直接字符串比较。所以对于一个简单的范围比较,我会建议字符串操作:

where mystring >= '2020-12-10' and mystring < '2020-12-16'

在考虑性能之前:使用正确的数据类型。

例如,尝试使用您的字符串表示形式获取 2020 年的所有 friday the thirteenth。使用日期非常简单:


CREATE table thisyear(
        thedate DATE NOT NULL PRIMARY KEY
        );

INSERT INTO thisyear(thedate)
SELECT generate_series('2020-01-01'::date, '2021-01-01'::date -1, '1 day'::interval)
        ;

SELECT * FROM thisyear
WHERE date_part('dow', thedate) = 5 -- friday
AND date_part('day', thedate) = 13  -- the thirteenth
        ;

结果:


CREATE TABLE
INSERT 0 366
  thedate   
------------
 2020-03-13
 2020-11-13
(2 rows)