【发布时间】: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 <= unix_timestamp, - 避免将
unix_timestamp转换为字符串,然后将datetime与该字符串进行比较(我想会慢很多)
- 做一个比较整数的查询(如果有很多行的话会非常快):
【问题讨论】:
-
我不知道这是否有帮助,但是当我以毫秒为单位使用 unix 时间时,作为 int 会溢出,越长越好。
-
@mama Sqlite 是否以毫秒或秒为单位使用 unix 时间戳?
-
python 默认使用秒。关于 sqlite 的 idk,但通常默认为毫秒
-
@DinoCoderSaurus 为什么?该行以当前时间戳插入。所以使用
datetime <= timestamp_1_month_in_the_future查询应该可以。 -
@DinoCoderSaurus IIRC,它还包含 HH:MM:SS 和可能的毫秒数?你有这方面的消息来源吗?
标签: python sqlite datetime unix-timestamp