DATETIME值在SQLite中如何工作?

DATETIME值在SQLite中如何工作?,sqlite,datetime,Sqlite,Datetime,我正在创建Android应用程序,需要保存创建记录的日期/时间。然而,SQLite文档说,“SQLite没有专门用于存储日期和/或时间的存储类”,它“能够将日期和时间存储为文本、实数或整数值” 是否存在使用一种类型而不是另一种类型的技术原因?一列可以按三种格式中的任意一种存储数据吗 我以后需要比较日期。例如,在我的应用程序中,我将显示从日期A到日期B之间创建的所有记录。我担心没有真实的日期时间列可能会导致比较困难。将其存储在long类型的字段中。请参见Date.getTime()和新日期(长)

我正在创建Android应用程序,需要保存创建记录的日期/时间。然而,SQLite文档说,“SQLite没有专门用于存储日期和/或时间的存储类”,它“能够将日期和时间存储为文本、实数或整数值”

是否存在使用一种类型而不是另一种类型的技术原因?一列可以按三种格式中的任意一种存储数据吗


我以后需要比较日期。例如,在我的应用程序中,我将显示从日期A到日期B之间创建的所有记录。我担心没有真实的日期时间列可能会导致比较困难。

将其存储在
long
类型的字段中。请参见
Date.getTime()
新日期(长)


SQLite没有为存储日期而预留的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为文本、实数或整数 价值观:

文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。像朱利安一样真实 day number,自11月12日格林威治中午以来的天数 公元前244714年,根据公历公历。整数 作为Unix时间,自UTC 1970-01-01 00:00:00以来的秒数。 应用程序可以选择将日期和时间存储在其中任何一个中 格式,并使用内置的日期和 时间函数


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

SQlite没有特定的日期时间类型。您可以使用
TEXT
REAL
INTEGER
类型,以适合您的需要为准

直接从医生那里
SQLite没有为存储日期和/或时间而预留的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为文本、实数或整数值:

  • 文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)
  • 实数和朱利安日一样,是指从公元前4714年11月24日格林威治正午开始的天数
  • 整数表示Unix时间,自1970-01-01 00:00:00 UTC以来的秒数
应用程序可以选择以其中任何一种格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换


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

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

在数据库、平面文件等中,始终支持整数作为整数。您只需做一点数学运算,然后将其转换为另一种类型,就可以按照自己的意愿格式化日期

这样做,当[insert current favorite database here]替换为[future favorite database]时,您就不必担心了,因为[future favorite database]恰好没有使用您今天选择的日期格式


这只是一点数学开销(例如,方法——需要两秒钟,如果必要的话,我会发布一个要点),并简化了以后关于日期/时间的许多操作。

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

  • ISO8601字符串

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

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

    • 最低存储空间
    • 快速行动
    • 小时间范围
    • 2038年可能出现的问题

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

如何比较??你能给我一个查询的例子吗d在Joda时间查看代码()中的比较,并在SQL中使用简单的长比较(例如数字比较);我也喜欢这个。无论如何,标准的日期/时间相关类在内部都有long支持,比较long非常容易。@dtmilano为什么这里更喜欢整数而不是字符串?INTEGER只使用8个字节,本例中文本使用23个字节。这不清楚如何选择存储数据的类型。这是否意味着如果我创建整数类型的列,函数将自动存储为Unix时间?REAL也使用8字节。直到2286年晚些时候,历元秒将是10位数,而且由于IEEE双精度,这将为您提供优于毫秒的分辨率
RSQLite
似乎正在将
POSIXct
转换为数字历元,所以它对我来说已经足够好了。@r2evans我不知道你在说什么。如果我想存储从纪元开始的毫秒,我该怎么做?需要注意的是——所有存储日期的方法都使用可以使用标准=、以及运算符之间进行比较的格式。“SQLite没有为存储日期和/或时间而预留的存储类”-除非它具有中从未提及的日期和日期时间类型documentation@Slabko没有。SQLite允许将任何内容(包括日期时间)作为列的声明类型。基于此,它为该列提供了一个与存储类的关联性(文档中甚至有一个示例说明了这是如何在DATETIME中工作的)。这种关联更像是一种提示,因为列中的每个条目实际上都可以具有不同的存储类。存储类仍然比类型弱一步,可以由多个类型支持。所以是的,你可以使用DATETIME。不,是的