DATETIME值如何在SQLite中运行?

时间:2013-06-21 03:11:10

标签: sqlite datetime

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

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

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

5 个答案:

答案 0 :(得分:73)

SQlite没有特定的日期时间类型。您可以使用TEXTREALINTEGER类型,以满足您的需求。

直接离开DOCS

  

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

     
      
  • TEXT as ISO8601 strings(“YYYY-MM-DD HH:MM:SS.SSS”)。
  •   
  • 真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据公历格里高利历。
  •   
  • INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
  •   
     

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

SQLite内置的日期和时间函数可以是found here

答案 1 :(得分:16)

  

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

     

TEXT as ISO8601 strings(“YYYY-MM-DD HH:MM:SS.SSS”)。真如朱利安   日数,11月以来格林威治中午以来的天数   公元前24,4714根据公历格里高利历。整数   as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。   应用程序可以选择在任何这些中存储日期和时间   使用内置日期格式和格式之间自由转换   时间函数。

话虽如此,我会使用 INTEGER 并存储自Unix纪元(1970-01-01 00:00:00 UTC)以来的秒数。

答案 2 :(得分:7)

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

  • ISO8601字符串

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

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

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

如果您需要比较不同的类型或导出到外部应用程序,您可以根据需要自由使用SQLite own datetime conversion functions

答案 3 :(得分:6)

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

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

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

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

答案 4 :(得分:4)

将其存储在long类型的字段中。请参阅Date.getTime()new Date(long)