126

我正在创建 Android 应用程序,需要保存创建记录的日期/时间。然而,SQLite 文档说,“SQLite 没有专门用于存储日期和/或时间的存储类”,它“能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值”。

使用一种类型而不是另一种类型是否有技术原因?单个列可以逐行以三种格式中的任何一种存储日期吗?

我需要稍后比较日期。例如,在我的应用程序中,我将显示在日期 A 到日期 B 之间创建的所有记录。我担心没有真正的 DATETIME 列可能会使比较变得困难。

4

5 回答 5

91

SQlite 没有特定的日期时间类型。您可以使用或类型TEXT,以适合您的需要。REALINTEGER

直接来自 DOCS

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 以来的秒数。

应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

SQLite 内置的日期和时间函数可以在这里找到

于 2013-06-21T03:23:07.713 回答
20

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 以来的秒数。应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

话虽如此,我将使用INTEGER并存储自 Unix 纪元(1970-01-01 00:00:00 UTC)以来的秒数。

于 2013-06-21T03:21:59.337 回答
17

SQLite 的强大功能之一是允许您选择存储类型。三种不同可能性中的每一种的优点/缺点:

  • ISO8601 字符串

    • 字符串比较给出有效结果
    • 存储小数秒,最多三位小数
    • 需要更多存储空间
    • 使用数据库浏览器时,您将直接看到它的值
    • 需要解析用于其他用途
    • “default current_timestamp”列修饰符将使用这种格式存储
  • 实数

    • 关于分数秒的高精度
    • 最长时间范围
  • 整数

    • 最低存储空间
    • 快速操作
    • 小时间范围
    • 可能的 2038 年问题

如果您需要比较不同的类型或导出到外部应用程序,您可以根据需要自由使用 SQLite自己的日期时间转换功能

于 2018-04-07T06:55:15.007 回答
7

将其存储在 type 的字段中long。见Date.getTime()new Date(long)

于 2013-06-21T03:15:49.577 回答
7

对于几乎所有日期和时间问题,我更喜欢简化事情,非常非常简单......以整数形式存储的秒数。

在数据库、平面文件等中,整数将始终被支持为整数。您做一些数学运算并将其转换为另一种类型,您可以随意格式化日期。

这样做,您不必担心 [在此处插入当前收藏的数据库] 被替换为 [未来收藏的数据库],巧合的是,它没有使用您今天选择的日期格式。

这只是一点点数学开销(例如方法——需要两秒钟,如有必要,我会发布一个要点)并简化了稍后有关日期/时间的许多操作。

于 2013-06-21T03:24:25.883 回答