【问题标题】:Sqlite datetime comparison with a unix timestampSqlite 日期时间与 unix 时间戳的比较
【发布时间】:2021-03-31 14:46:20
【问题描述】:

Sqlite 文档states:

SQLite 没有 DATETIME 数据类型。相反,日期和时间可以通过以下任何一种方式存储:

  • 作为 ISO-8601 格式的 TEXT 字符串。示例:'2018-04-02 12:13:46'。
  • 自 1970 年以来的整数秒数(也称为“unix 时间”)。
    ...

所以我决定使用INTEGER unix 时间戳:

import sqlite3, time
conn = sqlite3.connect(':memory:')
conn.execute("CREATE TABLE data(datetime INTEGER, t TEXT);")
conn.execute("INSERT INTO data VALUES (CURRENT_TIMESTAMP, 'hello')")

为什么下面的查询没有返回结果?

ts = int(time.time()) + 31*24*3600  # unix timestamp 1 month in the future
print(list(conn.execute("SELECT * FROM data WHERE datetime <= ?", (ts, ))))

更一般地说,如何使用 Sqlite 进行 SELECT 查询并与 unix 时间戳进行比较?


PS:

  • 我已经阅读了SQLite DateTime comparison 和类似的问题,它们提供了其他比较方法,但在这里我想准确讨论一下为什么这个 unix 时间戳比较不起作用。

  • 出于性能原因,我想:

    • 做一个比较整数的查询(如果有很多行的话会非常快):WHERE datetime &lt;= unix_timestamp,
    • 避免将unix_timestamp转换为字符串,然后将datetime与该字符串进行比较(我想会慢很多)

【问题讨论】:

  • 我不知道这是否有帮助,但是当我以毫秒为单位使用 unix 时间时,作为 int 会溢出,越长越好。
  • @mama Sqlite 是否以毫秒或秒为单位使用 unix 时间戳?
  • python 默认使用秒。关于 sqlite 的 idk,但通常默认为毫秒
  • @DinoCoderSaurus 为什么?该行以当前时间戳插入。所以使用datetime &lt;= timestamp_1_month_in_the_future 查询应该可以。
  • @DinoCoderSaurus IIRC,它还包含 HH:MM:SS 和可能的毫秒数?你有这方面的消息来源吗?

标签: python sqlite datetime unix-timestamp


【解决方案1】:

您在插入新行时使用CURRENT_TIMESTAMP
这意味着在您的列中,值不会存储为 unix 时间戳,因为 CURRENT_TIMESTAMPYYYY-MM-DD hh:mm:ss 的格式返回当前日期。

您可以使用datetime() 函数和unixepoch 修饰符将unix 时间戳转换为YYYY-MM-DD hh:mm:ss 格式的日期时间:

conn.execute("SELECT * FROM data WHERE datetime <= datetime(?, 'unixepoch')", (ts, ))

如果你的 unix 时间戳包含毫秒,你必须去掉它们:

conn.execute("SELECT * FROM data WHERE datetime <= datetime(? / 1000, 'unixepoch')", (ts, ))

或者,您可以使用函数strftime() 将列datetime 中的字符串日期时间转换为unix 时间戳:

conn.execute("SELECT * FROM data WHERE strftime('%s', datetime) + 0 <= ?", (ts, ))

如果要在列中存储整数值,请像这样使用strftime()

INSERT INTO data VALUES (strftime('%s', CURRENT_TIMESTAMP) + 0, 'hello')

【讨论】:

  • 谢谢@forpas。出于性能原因,我想做一个比较整数的查询(如果有很多行,那就超级快):WHERE datetime &lt;= unix_timestamp,并避免将unix_timestamp转换为字符串,然后比较日期时间到这个字符串(我想它会慢得多?)。你怎么看?
  • CURRENT_TIMESTAMP 以 YYYY-MM-DD hh:mm:ss 的格式返回当前日期 哦,这可能是原因,你有源/链接吗,以备日后参考?另外,我怎样才能将当前时间戳作为 unix 时间戳而不是字符串?
  • 谢谢@forpas! PS:为什么是+ 0
  • strftime() 返回一个字符串,+0 隐式转换为整数。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 2021-08-17
  • 2011-02-26
  • 2018-12-27
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多