Python Sqlite日期时间与unix时间戳的比较
Sqlite文档: SQLite没有日期时间数据类型。相反,日期和时间可以通过以下任一方式存储: 作为ISO-8601格式的文本字符串。示例:“2018-04-02 12:13:46”。 作为自1970年以来的整数秒数,也称为unix时间。 ... 因此,我决定使用整数unix时间戳:Python Sqlite日期时间与unix时间戳的比较,python,sqlite,datetime,unix-timestamp,Python,Sqlite,Datetime,Unix Timestamp,Sqlite文档: SQLite没有日期时间数据类型。相反,日期和时间可以通过以下任一方式存储: 作为ISO-8601格式的文本字符串。示例:“2018-04-02 12:13:46”。 作为自1970年以来的整数秒数,也称为unix时间。 ... 因此,我决定使用整数unix时间戳: import sqlite3, time conn = sqlite3.connect(':memory:') conn.execute("CREATE TABLE data(datetime INTE
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时间戳进行比较
附言:
我已经阅读了和类似的问题,这些问题提供了其他比较方法,但在这里我想确切地讨论一下为什么unix时间戳比较不起作用
出于性能原因,我想:
执行一个比较整数的查询,如果有很多行,这个查询速度会非常快:其中datetime插入新行时使用当前的\u时间戳。
这意味着在您的列中,值不会存储为unix时间戳,因为CURRENT_TIMESTAMP以YYYY-MM-DD hh:MM:ss格式返回当前日期
您可以使用函数datetime和unixepoch修饰符将unix时间戳转换为YYYY-MM-DD hh:MM:ss格式的datetime:
conn.execute("SELECT * FROM data WHERE datetime <= datetime(?, 'unixepoch')", (ts, ))
如果要在列中存储整数值,请按如下方式使用strftime:
INSERT INTO data VALUES (strftime('%s', CURRENT_TIMESTAMP) + 0, 'hello')
我不知道这是否有帮助,但当我使用unix时间(以毫秒为单位)时,作为int,它会产生溢出,long更好。@mama Sqlite使用unix时间戳(以毫秒或秒为单位)吗?python使用秒作为默认值。idk关于sqlite,但通常默认为milliseconds@DinoCoderSaurus为什么?插入带有当前时间戳的行。所以用datetime@DinoCoderSaurus IIRC查询时,它还包含HH:MM:SS,可能还有毫秒?你有这方面的消息来源吗?谢谢@forpas。出于性能方面的原因,我想做一个比较整数的查询,如果有很多行,它会非常快:其中datetime CURRENT\u TIMESTAMP以YYYY-MM-DD hh:MM:ss的格式返回当前日期。哦,这可能是原因,您是否有用于此的源/链接,以供将来参考?另外,我如何将当前时间戳作为unix timetamp而不是字符串获取?@Basj查看我编辑的答案。谢谢@forpas!为什么+0?strftime返回字符串,+0隐式转换为整数。
conn.execute("SELECT * FROM data WHERE strftime('%s', datetime) + 0 <= ?", (ts, ))
INSERT INTO data VALUES (strftime('%s', CURRENT_TIMESTAMP) + 0, 'hello')