ios - 如何选择 SQLite 中两个值之间的所有行?
问题描述
我正在构建一个 iOS 应用程序,我想在用户选择的两个日期之间从我的数据库中检索所有值。例如,我想要从 3 月 1 日到 3 月 5 日的所有行。看起来像
SELECT * FROM MAIN WHERE DATE = '01/03/2020' AND ENDS ='05/03/2020'
因此,我希望从中检索 3 月 1 日、2 日、3 日、4 日和 5 日的所有数据。关于如何做到这一点的任何想法?谢谢
解决方案
有两个问题:
日期类型:
正如SQLite 第 3 版中的数据类型所说:
2.2. 日期和时间数据类型
SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值:
TEXT 作为 ISO8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
REAL 作为儒略日数字,根据预测的公历,自公元前 4714 年 11 月 24 日格林威治中午以来的天数。
INTEGER 作为 Unix 时间,自 1970-01-01 00:00:00 UTC 以来的秒数。
应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。
所以以某种格式存储日期
dd/MM/yyyy
(使用DateFormatter
大写约定)是有问题的,因为在没有原生日期类型的情况下,它将把它们存储为字符串,因此所有比较都将按字母顺序进行,而不是按时间顺序,对值进行排序03/10/2009
(或废话字符串02foobar
之间的字符串01/05/2020
和05/05/2020
.但是,如果您将它们存储为
yyyy-MM-dd
,那么按字母顺序比较也会产生按时间顺序正确的比较。SQL 语法:
一旦您将日期以可比较的格式保存在数据库中,那么如果您将所有日期都放在一个列中,则可以使用该
BETWEEN
语法。例如,假设您以yyyy-MM-dd
格式存储了所有日期,那么您可以执行以下操作:SELECT * FROM main WHERE date BETWEEN '2020-03-01' AND '2020-03-05';
但不用说,只要您的日期以
dd/MM/yyyy
格式存储,您就不能使用这种模式(或除相等以外的任何比较运算符)。