DATETIME 值在 SQLite 中是如何工作的?

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

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

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

138302 次浏览

将它存储在类型为 long的字段中。参见 Date.getTime()new Date(long)

SQLite 没有预留用于存储日期的存储类 取而代之的是 SQLite 内置的日期和时间函数 能够将日期和时间存储为 TEXT、 REAL 或 INTEGER 价值观:

文本为 ISO8601字符串(“ YYYY-MM-DD HH: MM: SS.SSS”) 天数,即自11月格林威治中午以来的天数 根据外推格里高利历,公元前24,4714年 作为 Unix 时间,即自1970-01-0100:00:00:00 UTC 以来的秒数。 应用程序可以选择在其中任何一个中存储日期和时间 格式之间自由转换的格式使用内置的日期和 时间函数。

尽管如此,我将使用 整数并存储 Unix 时代以来的秒(1970-01-0100:00:00:00 UTC)。

SQlite 没有特定的日期时间类型。您可以使用 TEXTREALINTEGER类型,以符合您的需要为准。

直接从医生那里拿来的

SQLite 没有预留用于存储日期和/或时间的存储类。相反,SQLite 的内置 Date And Time 函数能够将日期和时间存储为 TEXT、 REAL 或 INTEGER 值:

  • 文本为 ISO8601字符串(“ YYYY-MM-DD HH: MM: SS.SSS”)。
  • 根据外推格里高利历,这是公元前4714年11月24日格林威治中午以来的天数。
  • INTEGER 作为 Unix 时间,指自1970-01-0100:00:00 UTC 以来的秒数。

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

SQLite 内置的 Date 和 Time 函数可以是 发现这里

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

在数据库、平面文件等中,总是支持整数作为整数。您可以做一些数学运算,将其转换为另一种类型,并且可以按照您的需要设置日期的格式。

通过这种方式,您不必担心[在这里插入当前最喜欢的数据库]被[未来最喜欢的数据库]替换,而[未来最喜欢的数据库]恰巧没有使用您今天选择的日期格式。

它只是一个小小的数学开销(例如方法——需要两秒钟,如果有必要,我将发布一个主旨) ,并简化了日期/时间方面的大量操作。

SQLite 的一个强大特性是允许您选择存储类型。三种不同可能性各自的优点/缺点:

  • ISO8601字符串

    • 字符串比较提供有效的结果
    • 存储分数秒,最多三位十进制数字
    • 需要更多的存储空间
    • 在使用数据库浏览器时,您将直接看到它的值
    • 需要为其他用途进行解析
    • “ default current _ time戳”列修饰符将使用这种格式存储
  • 真正的数字

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

    • 最低的存储空间
    • 快速行动
    • 时间范围很小
    • 可能有2038年问题

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