首页 > 解决方案 > 如何选择 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 日的所有数据。关于如何做到这一点的任何想法?谢谢

标签: iossqldatabasesqlite

解决方案


有两个问题:

  1. 日期类型:

    正如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/202005/05/2020.

    但是,如果您将它们存储为yyyy-MM-dd,那么按字母顺序比较也会产生按时间顺序正确的比较。

  2. SQL 语法:

    一旦您将日期以可比较的格式保存在数据库中,那么如果您将所有日期都放在一个列中,则可以使用该BETWEEN语法。例如,假设您以yyyy-MM-dd格式存储了所有日期,那么您可以执行以下操作:

    SELECT * FROM main WHERE date BETWEEN '2020-03-01' AND '2020-03-05';
    

    但不用说,只要您的日期以dd/MM/yyyy格式存储,您就不能使用这种模式(或除相等以外的任何比较运算符)。


推荐阅读