【问题标题】:SQLite strftime() returning null with integersSQLite strftime() 返回空整数
【发布时间】:2020-09-14 23:01:17
【问题描述】:

我的表“productions”中有一个列名为“date”的日期,该日期以 Unix 格式的整数形式存储(例如:1548263300000)。我只想检索年份。当我这样做时:

SELECT strftime('%Y ',date) as year
FROM productions 

它返回空值。

当我将类型更改为 TEXT 到我的表中并以字符串格式存储日期(例如 2020-05-01 )时,相同的 sql 返回“2020”,这是正确的,也是我正在寻找的。

为什么 strftime() 不适用于整数,因为 SQLite documentation 说您可以使用 TEXT、INTEGER 和 REAL 作为日期?如何使用带整数的日期函数?

额外信息:

在本教程中,他们还将 strftime 与整数一起使用,它似乎对他们有用,所以我从中了解到,无论您使用什么类型(文本、整数、真实),这些函数都可用:link

当我使用时:

SELECT strftime('%Y',DATETIME(ROUND(date/ 1000), 'unixepoch')) 
FROM productions;

它工作正常,但我不明白为什么我在使用整数时必须这样做,但当我使用文本时,它直接工作。

【问题讨论】:

    标签: sql sqlite date strftime


    【解决方案1】:

    您可以使用strftime(),但您必须添加'unixepoch' 修饰符:

    strftime('%Y', date / 1000, 'unixepoch')
    

    因此您的date / 1000 被识别为自1970-01-01 以来的秒数。

    来自Date And Time Functions

    “unixepoch”修饰符 (11) 仅在紧跟在 DDDDDDDDDD 格式的时间字符串。该修饰符导致 DDDDDDDDDD 不像通常那样被解释为儒略日数 会,但作为 Unix 时间 - 自 1970 年以来的秒数。

    【讨论】:

    • 对不起,我不明白。文档说整数已经在存储 unix 时间 sqlite.org/datatype3.html 。那么为什么我必须使用“unix epoch”修饰符,如果它已经是那种格式呢?无论如何,这些函数不是很直观,因为 SQLite 文档说支持文本、整数和实数,但是您需要对整数使用操作和修饰符,而不是文本。感谢您的快速答复。
    • SQLite 中没有 DATE 数据类型。该文档描述了您可以存储日期的各种方式,以便可以轻松地将其解释为用于比较的日期。如果您将日期存储为 dd-mm-yyyy ,则不能直接将其用作日期并将其与其他日期进行比较。您可以使用的唯一有效日期格式如下:sqlite.org/lang_datefunc.html (2. Time Strings) 其中整数表示不在其中,但有浮点数。因此,您需要“unixepoch”才能将整数解释为日期。
    猜你喜欢
    • 2011-02-02
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多