处理DateTime的最有效方法是什么,特别是因为DATETIME列导致了NUMERIC?

StackOverflow上的答案引用了文档的相同部分(如下所示):

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以来的秒数。

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

但是我认为有些人(问题提示者和答案者) 对表创建感到困惑或遗漏了以下细节 ,其中DateTime实际上是内部的NUMERIC类型,应该创建为DATETIMENUMERIC以避免与表格相关的性能问题。铸件。

我可能会误解某些东西,但我确实看到那里的答案告诉人们为日期时间创建一个TEXT列,这看起来效率不高。

鉴于我可以将日期时间列查询为TEXT,REAL或INTEGER,处理日期时间的最有效方法是什么,尤其是因为DATETIME列导致NUMERIC。

  • 由于TEXT,REAL或Integer的比较,NUMERIC / DateTime的columnType是否会导致转换延迟?

  • SQLite的TEXT列类型和TEXT查询类型可以更快吗?

  • SQLite的REAL列类型和REAL查询类型可以更快吗?

  • SQLite的INTEGER列类型和INTEGER查询类型可以更快吗?

  • 如何将DATETIME转换为NUMERIC以加快查询速度?

为了那些提出上述问题的人的利益,或过分关注理论来回答它,我提供了一个答案,试图解决你的问题的意图……“处理日期时间的最有效方法是什么”。 “尤其是因为DATETIME列导致了NUMERIC。” 您还在评论中提到了移动设备。

首先,在移动环境中,您很少需要处理大型数据集。 因此,您编写的最有效的代码是代码,当您需要更改它时,代码不会混淆,即使在框架发展时也能正常工作。

因此,字符串或整数可能会起作用,具体取决于您最熟悉的工作。 如果您对使用日期作为整数进行混淆,请使用字符串。 如果您必须将工作公开给喜欢字符串的组,请选择它。

也就是说,如果你真的是设备性能驱动,那么使用索引时整数比较是最快的。 如果您遇到性能问题,通常最好使用索引来解决。

因此,回答所有问题的问题 – 是的,投射导致延迟,但这些延迟通常无关紧要,因为您正在处理小数据集。 但是,当它确实重要时,整数比较是最快的(这与您引用的问题一样有详细记录),因此将DATETIME值转换为整数以优化查询性能。

然后你的标题特别提到“INSERT”和“UPDATE” – 然后引发了一个问题,“如果INSERT和UPDATE性能是你关注的话,你真的需要一个索引吗?索引会增加INSERT和UPDATE语句的开销。” 由于相对较高的处理能力以及通常无法在移动设备中创建具有大量INSERT或UPDATE语句的情况,这通常也无关紧要。

但是,如果这确实是一个问题,那么事务与查询的标准数据库优化就成了问题。 您可能需要构建两个数据库,一个用于支持INSERT / UPDATE活动,另一个用于查询,具有一些同步过程。 或者您可能需要为遇到的INSERT / UPDATE与SELECT情况进行有意识的权衡。

换句话说,就像很多详细的问题一样,答案在很大程度上取决于您的应用程序/软件面临的特定问题,用户的需求/需求,您目标和/或支持的硬件以及正在构建/维护的团队产品。

即便如此,简短的回答是“它可能并不重要”,如果确实如此,那么使用INTEGER,除非您可以更具体地了解您的特定用例。

这些问题预先假定事实并非如此。

SQLite没有列类型。 只有列关联 , 限制可以在列中实际存储的类型。

没有特殊的DATETIME类型。 当文档提到TEXT,REAL和INTEGER时,这意味着您实际上必须使用其中一种类型作为您的值。 一旦你使用了这样一个值,SQLite就不会自动将它转换成另一种类型,因为它不知道这个值是一个日期/时间值。

由于TEXT,REAL或Integer的比较,NUMERIC / DateTime的columnType是否会导致转换延迟?

只有当列中存储了一种类型的值并且正在与另一种类型进行比较时,才会出现转换延迟。 (像'1970-01-01'这样的字符串永远不会0这样的数字相等,所以这样的比较是没有意义的。)

SQLite的TEXT列类型和TEXT查询类型可以更快吗?

列类型并不重要。

如果将TEXT值存储在列中,则必须使用TEXT值进行查询。
如果在列中存储REAL值,则必须使用REAL值进行查询。
如果在列中存储INTEGER值,则必须使用INTEGER值进行查询。

如何将DATETIME转换为NUMERIC以加快查询速度?

没有DATETIME类型。