sql - 在 Postgresql 中比较字符串日期的最有效方法?
问题描述
我们有一个在 AWS(引擎版本 11.8)上运行的 PostgreSQL 数据库。
对于每个项目,我们将日期存储为字符串 [varchar 类型](格式如下 - '2020-12-16')
我们的应用程序需要进行日期范围查询。基于此,在 PostgreSQL 中进行字符串日期比较的最佳和最有效的方法是什么?
我在这里查看了几个关于 SO 的问题,但是没有人谈论这个问题,将日期存储为“varchar”类型或“date”类型是否存在差异。
同样基于上述 2 种存储类型,最有效的查询方式是什么?特别是我们正在寻找范围查询(例如从“2020-12-10”和“2020-12-16”)
非常感谢您的反馈
解决方案
没有人谈论将日期存储为“varchar”类型或“date”类型是否有区别的问题。
修复你的数据模型!您应该使用正确的数据类型来存储数据:日期应该存储为date
. 使用错误的数据类型是错误的,原因有很多:
每当您需要进行日期运算时,都需要将字符串转换为日期(例如:如何将一个月添加到字符串
'2020-12-16'
?);这是非常低效的在存储您的数据时无法强制执行数据完整性;即使使用检查约束也是不够的。例如:您如何判断
'2021-02-29'
日期是否有效?
进行查询的最有效方法是什么?特别是,我们正在研究查询范围。
也就是说,您使用的格式可以进行直接的字符串比较。所以对于一个简单的范围比较,我建议字符串操作:
where mystring >= '2020-12-10' and mystring < '2020-12-16'
推荐阅读
- three.js - 如何链接矩阵变换操作?
- ios - 在 xcode 上构建应用程序时出错(无法加载包)
- swift - 为什么 startIndex 不等于 endIndex 在 Swift 中转移到 String 中的 startIndex 位置?
- python - PyGame MOUSEBUTTONDOWN 事件未注册?
- mysql - 如何选择最新记录
- javascript - Vuetify 自定义时间选择器组件不更新模型并给出错误
- unity3d - 导出卡通着色器 Maya
- functional-programming - 在对象嵌套数组中查找对象的路径
- python - 使用 libav* 将每帧的时间戳编码和解码到 mp4
- sql - 从另一个表插入数据 - Oracle SQL