【问题标题】:Most Efficient Way to Compare String Dates in Postgresql?在 Postgresql 中比较字符串日期的最有效方法?
【发布时间】:2021-03-27 01:41:46
【问题描述】:

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

【问题讨论】:

  • "我们将日期存储为字符串" - 为什么,哦,为什么?永远不要那样做。

标签: sql postgresql date datetime date-arithmetic


【解决方案1】:

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

例如,尝试使用您的字符串表示形式在 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)

【讨论】:

    【解决方案2】:

    没有人谈论将日期存储为“varchar”类型或“date”类型是否有区别。

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

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

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

    最有效的查询方式是什么?特别是,我们正在研究范围查询。

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

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

    【讨论】:

    • ok 这意味着使用日期类型 + 使用 >= 和
    • @AleksandarT 可以使用的运算符取决于数据类型。 (又是一个使用 DATE 类型的好理由)
    • 您认为 BETWEEN 会有什么性能差异吗?
    • 比较date 会更便宜,因为这是一个整数比较。比较字符串必须遍历字符,除非您指定 C 排序规则(您应该这样做),否则您将获得昂贵的区域敏感比较。
    • 加号;估计工作日或周数将非常困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2011-01-19
    • 2019-03-06
    相关资源
    最近更新 更多