【发布时间】:2018-02-10 14:18:36
【问题描述】:
如何比较 SQLite 数据库中以 DD-MMM-YYYY 格式存储的日期,例如2017 年 10 月 10 日?
我想比较日期并选择特定日期和相邻日期的行。
【问题讨论】:
标签: sqlite
如何比较 SQLite 数据库中以 DD-MMM-YYYY 格式存储的日期,例如2017 年 10 月 10 日?
我想比较日期并选择特定日期和相邻日期的行。
【问题讨论】:
标签: sqlite
简答:
很痛苦。您必须将日期字符串(尤其是字符月份)转换为数值,然后才能比较日期值。
... 或者更简单的是,使用“2018-01-01”之类的格式存储您的日期,该格式可以通过 SQLite 日期函数在 SQL 中进行本地比较。
更长的答案
This page 显示所有可用的 SQLite SQL 日期时间函数。它们都不产生或操纵字符月份值。所以你的选择是:
1) 通过 SQL 选择一组记录到一个数据集中;然后使用您的编程语言将数据集中的日期值转换为值可比较的格式;然后比较它们。
这对于除了非常小的数据查询之外的任何事情都会有很差的性能,但实现起来可能相当简单,并且不需要数据转换。 (为了具体回答您提出的问题,这是选择少数和小型数据集的应用程序的最佳解决方案。)
2) 创建一个 SQLite 函数来进行日期格式转换。为此,您使用 SQLite 的 C API。 See more how-to discussion here.
我自己没有这样做过,我不会仅仅因为学习曲线,也因为 SQLite 的类型和用途及其功能而推荐这条路线。 (具体回答你提出的问题,对于不少和不小的数据集,这是最好的解决方案。)
3) (此选项不回答您的具体问题)将您存储的日期值转换为原生 SQL 可比较格式。喜欢:“2018-01-01”。然后您可以使用 SQLite 日期时间函数进行相邻日期比较。
示例:
select mySQLTableDate, myOtherSQLTableDate
date(mySQLTableDate,'+1 day'), -- YYYY-DD-MM stored format
date(strftime('%Y-%m-%d', mySQLTableDate),'+1 day') -- many stored formats
from mySQLTable
where select mySQLTableDate = date(myOtherSQLTableDate,'+1 day')
根据目标而不是具体问题回答您的问题 :),我的建议是使用此解决方案,尤其是在您扫描大量数据的情况下。 See more about SQLite Date types here,但是对于没有时间的日期,我只是将它们存储为字符串“2018-01-01”。我正在使用 .js,这很容易与 .js 日期对象相互转换。
【讨论】: