在 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)
我们在 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)