SQLite没有日期数据类型?我该如何解决它?

3

SQLite没有日期数据类型。

我想知道在日期字符串之间进行字符串比较是否足够,例如使用标准SQL日期时间格式Y-m-d H:i:s

例如...WHERE date < NOW()...。这种情况会失败吗?


http://www.sqlite.org/lang_datefunc.html - dierre
但如果我想让我的查询与MySQL兼容,我就不能使用那些。 - Alex
抱歉,我不明白问题出在哪里。我会使用Unix时间戳。 - dierre
5个回答

5
您可以使用以下数据类型在SQLite中存储日期:
  • TEXT:ISO8601字符串格式("YYYY-MM-DD HH:MM:SS.SSS")
  • REAL:儒略日数字,即格林威治时间公元前4714年11月24日中午起至今的天数。
  • INTEGER:Unix时间,即从1970年01月01日00时00分00秒UTC开始的秒数。
您可以使用此处列出的函数将这些虚假日期转换为实际日期。
此外,您提到了MySQL中的函数NOW(),但是这个函数在SQLite中无法使用。以下是SQLite使用的语法:
sqlite> select date('now');
2012-02-12
sqlite> select date('now') = date('2012-02-12');
1
sqlite> select date('now') = date('2012-02-11');
0

因此,强烈建议您使用这些函数,并确保不使用 NOW() 函数。


十年过去了,SQLite 仍然没有适当的日期时间支持,这令人感到荒谬。 - A.R.

3

引自Roger的话

SQLite没有专门的日期时间类型, 但有一些日期时间函数。遵循这些函数理解的字符串表示格式(实际上只有1-10种格式),然后您可以使用它们,加上字符串的字典序比较将匹配日期时间比较(只要不尝试将日期与时间或日期时间与时间进行比较,这也没有多大意义)。

根据您使用的语言,甚至可以获得自动转换。(这不适用于像示例中的SQL语句比较,但会使您的生活更轻松。)


2

我个人喜欢使用无符号整数和Unix时间戳来表示日期。将日期表示为整数非常简单高效,而PHP也有许多函数可以将这些日期转换为易于阅读的格式。

http://php.net/manual/en/function.date.php


2
使用 now() 是行不通的,因为 SQLite 不知道它的含义。SQLite 知道 current_timestamp 的含义并且 它具有所需的格式

CURRENT_TIMESTAMP 的格式为 "YYYY-MM-DD HH:MM:SS"。

在 MySQL 中,current_timestampnow() 的同义词,也具有所需的格式

'YYYY-MM-DD HH:MM:SS' 的值返回当前日期和时间。

因此,它们都使用 ISO-8601 时间戳格式,几乎任何数据库都可以轻松地在 ISO-8601 字符串和时间戳之间进行转换,因此这是一个良好且可移植的选择。

1

我相当确定在某些情况下它会失败。 一种更快的方法是存储time()值(或mktime()),并基于time()生成查询。

这也适用于MySQL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接