我正在创建Android应用,并且需要保存创建记录的日期/时间。SQLite文档说,但是,“ SQLite没有为存储日期和/或时间预留存储类”,并且“能够将日期和时间存储为TEXT,REAL或INTEGER值”。
是否出于技术原因使用一种类型而不是另一种类型?而且,单列可以行与行之间的三种格式中的任何一种存储日期吗?
我稍后需要比较日期。例如,在我的应用程序中,我将显示在日期A到日期B之间创建的所有记录。我担心没有真实的DATETIME列会导致比较困难。
我正在创建Android应用,并且需要保存创建记录的日期/时间。SQLite文档说,但是,“ SQLite没有为存储日期和/或时间预留存储类”,并且“能够将日期和时间存储为TEXT,REAL或INTEGER值”。
是否出于技术原因使用一种类型而不是另一种类型?而且,单列可以行与行之间的三种格式中的任何一种存储日期吗?
我稍后需要比较日期。例如,在我的应用程序中,我将显示在日期A到日期B之间创建的所有记录。我担心没有真实的DATETIME列会导致比较困难。
Answers:
SQlite没有特定的日期时间类型。您可以使用TEXT
,REAL
或INTEGER
类型,无论适合您的需要。
SQLite没有为存储日期和/或时间预留存储类。相反,SQLite内置的日期和时间函数可以将日期和时间存储为TEXT,REAL或INTEGER值:
- 文本为ISO8601字符串(“ YYYY-MM-DD HH:MM:SS.SSS”)。
- 实际为儒略日数,根据公历前的公历,公元前4714年11月24日格林威治中午以来的天数。
- INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
应用程序可以选择以任何一种格式存储日期和时间,并使用内置的日期和时间功能在格式之间自由转换。
SQLite内置的日期和时间函数可以在此处找到。
SQLite没有为存储日期和/或时间预留存储类。相反,SQLite内置的日期和时间函数可以将日期和时间存储为TEXT,REAL或INTEGER值:
文本为ISO8601字符串(“ YYYY-MM-DD HH:MM:SS.SSS”)。实际为儒略日数,根据公历前的公历,公元前4714年11月24日格林威治中午以来的天数。INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。应用程序可以选择以任何一种格式存储日期和时间,并使用内置的日期和时间功能在格式之间自由转换。
话虽如此,我将使用INTEGER并存储自Unix纪元(1970年1月1日00:00:00 UTC)以来的秒数。
RSQLite
似乎正在转换POSIXct
为数字时代,所以对我来说效果很好。
SQLite的强大功能之一是允许您选择存储类型。三种不同可能性的优点/缺点:
ISO8601字符串
实数
整数
如果您需要比较不同的类型或导出到外部应用程序,则可以根据需要随意使用SQLite 自己的日期时间转换函数。
localtime_r()
(sqlite.org/lang_datefunc.html#caveats_and_bugs),localtime()
如果主机平台具有32位,则可能容易受到2038攻击time_t
。就是说,由于SQLite声称通过将外部日期映射到安全范围内的预转换中来防止这种可能性(请参阅同一链接),所以我认为除非是在深奥的情况下,否则这不太可能成为问题。
将其存储在type字段中long
。看到Date.getTime()
和new Date(long)