DATETIME值如何在SQLite中运行?

Kha*_*han 104 sqlite datetime

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

是否存在使用一种类型而非另一种类型的技术原因?并且单个列可以存储从行到行的三种格式中的任何一种格式吗?

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

neo*_*108 79

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

直接来自DOCS

SQLite没有为存储日期和/或时间而预留的存储类.相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值:

  • TEXT为ISO8601字符串("YYYY-MM-DD HH:MM:SS.SSS").
  • 真实如朱利安日数,根据公历4714年11月24日格林威治中午以来的天数.
  • INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数.

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

可以在此处找到 SQLite内置的日期和时间函数.

  • 需要注意的重要事项 - 所有存储日期的方法都使用可以使用标准=,<,>和BETWEEN运算符进行比较的格式. (9认同)
  • @Slabko它没有.SQLite允许任何(包括DATETIME)作为列的声明类型.基于此,它为该列提供了与存储类的关联(它甚至在文档中有关于DATETIME如何工作的示例).这种亲和力更像是一个提示,因为列的每个条目实际上可以有不同的存储类.存储类仍然比类型弱一步,并且可以由多种类型支持.所以是的,你可以使用DATETIME.不,它实际上并不支持它作为类型或存储类.是的,文档实际上包含"DATETIME"一词. (9认同)
  • “SQLite 没有专门用于存储日期和/或时间的存储类”——除了它有 DATE 和 DATETIME 类型,这些类型在文档中从未提及 (3认同)

Die*_*ano 19

SQLite没有为存储日期和/或时间而预留的存储类.相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值:

TEXT为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-01-01 00:00:00 UTC)以来的秒数.

  • 我也更喜欢这个。无论如何,标准日期/时间相关类在内部都由长数支持,并且比较长数非常容易。 (2认同)
  • REAL也使用8个字节。纪元秒将是10位数字,直到2286年末为止,并且由于IEEE两倍[支持15-17个有效数字](https://en.wikipedia.org/wiki/Double-precision_floating-point_format),因此,分辨率比毫秒级更好。RSQLite似乎正在将POSIXct转换为数字纪元,因此对我来说效果很好。 (2认同)

Zso*_*Zso 12

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

  • ISO8601字符串

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

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

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

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

  • @guanboshen 据我所知,担心 2038 的唯一原因是主机平台的支持。SQLite 文档声称在参考实现中使用 C 的 `localtime_r()` (https://www.sqlite.org/lang_datefunc.html#caveats_and_bugs),如果主机平台,`localtime()` 可能容易受到 2038 的攻击有一个 32 位的“time_t”。也就是说,由于 SQLite 声称通过将外部日期映射到安全范围预转换来防止这种可能性(请参阅相同的链接),我认为这不太可能成为问题,除非在深奥的情况下。 (2认同)

小智 7

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

数据库,平面文件等中的整数将始终作为整数支持.您可以进行一些数学运算并将其转换为其他类型,您可以根据需要格式化日期.

这样做,你不必担心[在这里插入当前最喜欢的数据库]被[未来最喜欢的数据库]替换,而这恰好没有使用你今天选择的日期格式.

这只是一个小的数学开销(例如.方法 - 需要两秒钟,如果有必要我会发布一个要点)并简化日期/时间以后的大量操作.


koe*_*oem 6

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