如何在SQLite中存储日期时间

Mat*_*hew 6 sqlite datetime android database-performance android-sqlite

这非常类似于另一个被关闭的问题,而不是一个真正的问题.我试图编辑它以使其有效重新开放,但被告知我最好不要问一个新问题.

我正在开发android并需要在sqlite数据库中存储datetime值来跟踪将生成通知的重复事件.我还需要能够根据时间范围查询数据库.

SQLite的文档指出它不支持特定的日期类型但日期可以使用文本,REAL,或整型表示:

TEXT为ISO8601字符串("YYYY-MM-DD HH:MM:SS.SSS").

真实如朱利安日数,根据公历4714年11月24日格林威治中午以来的天数.

INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数.

最初的优点似乎是:

  • TEXT对于数据库中的可读性非常有用,能够在以后直接显示(无需转换),但如果需要对它们执行计算则成本很高.从时区引入可能的错误.
  • 真正适用于1970年以前的日期,适合计算或日期比较.不代表时间,只代表几天.
  • INTEGER可用于计算或日期时间比较,非常好的兼容性,因为它是一个广泛支持的标准.

这听起来不错吗?使用INTEGER作为日期时间会使查询时间范围明显快于使用TEXT时的速度吗?还有什么我还没考虑过吗?

鉴于我的用例,哪些解决方案最好?

CL.*_*CL. 5

TEXT 对数据库中的可读性很有用,并且能够在以后直接显示(无需转换)

ISO 格式通常不用于显示;你也必须改变它。(这种格式对于调试更有用。)

如果需要对它们执行计算,则成本高昂

对于数据库,瓶颈通常是 I/O。我怀疑您是否会看到一个查询,其中日期值的实际格式会产生显着差异。

从时区引入可能的错误。

TEXT 格式没有时区说明符,但也没有其他格式。如果您说所有的 DB 值都采用 UTC,则没有区别。

REAL 对 1970 年之前的日期很有用

所有格式都支持 0 到 9999 之间的所有年份。(整数可以是负数。)

不代表一天中的时间,只代表几天。

一天中的时间表示为一个小数值。

INTEGER ...非常好的兼容性,因为它是一个广泛支持的标准。

但是 Java 使用毫秒,而不是秒。

还有什么我没有考虑过的吗?

大多数内置日期函数的默认输出格式是 TEXT。


鉴于我的用例,这些解决方案中的哪一个是最好的?

我会说 TEXT,但我认为不会有太大区别。