首页 > 解决方案 > 获取sqlite的日月日

问题描述

当我想在没有时间的情况下获取日期时

SELECT strftime('%Y-%m-%d',date) from nameTable

我总是得到这个结果:-471-11-24

标签: sqlite

解决方案


更新

数据库中的实际值为 1593742280658

这似乎是SQLite 无法处理的Unix 纪元时间 (以毫秒为单位)。你需要把它变成秒,然后用修饰符告诉strftime你想要 unix 纪元时间。unixepoch

sqlite> SELECT strftime('%Y-%m-%d', 1593742280658/1000, 'unixepoch');
strftime('%Y-%m-%d', 1593742280658/1000, 'unixepoch')
-----------------------------------------------------
2020-07-03 

为什么-471-11-24?这就是你从中得到的SELECT strftime('%Y-%m-%d', 0);。如果没有unixepoch修饰符,SQLite 将整数解释为儒略日数,即自公元前 4714 年 11 月 24 日以来的天数。

你得到-471,而不是-4714,因为%Y只有四个字符的空间。select date(0)会全力以赴-4713-11-24

select strftime('%Y-%m-%d', 1593742280658)SQLite 试图将 1593742280658 解释为儒略日。这远远超出了其定义的范围,因此任何事情都可能发生。

这些函数仅适用于 0000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期(儒略日编号 1721059.5 到 5373484.5)。对于超出该范围的日期,这些函数的结果是未定义的。

在我的实现中,我得到一个空字符串。在您看来,您似乎得到了朱利安第 0 天。


日期列是日期类型

SQLite没有真正的日期类型

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

  • TEXT 作为 ISO8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • REAL 作为儒略日数字,根据预测的公历,自公元前 4714 年 11 月 24 日格林威治中午以来的天数。
  • INTEGER 作为 Unix 时间,自 1970-01-01 00:00:00 UTC 以来的秒数。

并且与其他 SQL 数据库不同,SQLite 类型由值决定。它将忽略您的类型声明。

SQLite 版本 3 数据库中的任何列,除了 INTEGER PRIMARY KEY 列,都可以用于存储任何存储类的值。

如果你把42nameTable.date存储为一个整数。如果你把'fourty-two'nameTable.date存储为文本。


推荐阅读