我正在创建 Android 应用程序,需要保存创建记录的日期/时间。然而,SQLite 文档说,“SQLite 没有专门用于存储日期和/或时间的存储类”,它“能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值”。
使用一种类型而不是另一种类型是否有技术原因?单个列可以逐行以三种格式中的任何一种存储日期吗?
我需要稍后比较日期。例如,在我的应用程序中,我将显示在日期 A 到日期 B 之间创建的所有记录。我担心没有真正的 DATETIME 列可能会使比较变得困难。
SQlite 没有特定的日期时间类型。您可以使用或类型TEXT
,以适合您的需要。REAL
INTEGER
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 内置的日期和时间函数可以在这里找到。
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)以来的秒数。
SQLite 的强大功能之一是允许您选择存储类型。三种不同可能性中的每一种的优点/缺点:
ISO8601 字符串
实数
整数
如果您需要比较不同的类型或导出到外部应用程序,您可以根据需要自由使用 SQLite自己的日期时间转换功能。
将其存储在 type 的字段中long
。见Date.getTime()
和new Date(long)
对于几乎所有日期和时间问题,我更喜欢简化事情,非常非常简单......以整数形式存储的秒数。
在数据库、平面文件等中,整数将始终被支持为整数。您做一些数学运算并将其转换为另一种类型,您可以随意格式化日期。
这样做,您不必担心 [在此处插入当前收藏的数据库] 被替换为 [未来收藏的数据库],巧合的是,它没有使用您今天选择的日期格式。
这只是一点点数学开销(例如方法——需要两秒钟,如有必要,我会发布一个要点)并简化了稍后有关日期/时间的许多操作。