SQLite datetime时差
如何使用Python Sqlitesqlite3模块获取具有小于2小时的datetime列的行?
我尝试了这个:
import sqlite3, datetimedb = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
c = db.cursor()
c.execute('CREATE TABLE mytable (id integer, date timestamp)')
c.execute('INSERT INTO mytable VALUES (1, ?)', (datetime.datetime(2018,1,1,23,0),))
c.execute('INSERT INTO mytable VALUES (2, ?)', (datetime.datetime(2018,1,2,0,0),))
c.execute('INSERT INTO mytable VALUES (3, ?)', (datetime.datetime(2018,1,9,0,0),))
该查询有效:
c.execute('SELECT mt1.date, mt2.date FROM mytable mt1, mytable mt2')
并返回:
(datetime.datetime(2018,1,1,23,0),datetime.datetime(2018,1,1,23,0))
(datetime.datetime(2018,1,1,23,0),datetime.datetime (2018,1,2,0,0))
(datetime.datetime(2018,1,1,23,0),datetime.datetime(2018,1,9,0,0))
…
(datetime.datetime (2018,1,9,0,0),datetime.datetime(2018,1,9,0,0))
但是datetime差异计算不起作用:
c.execute('SELECT ABS(mt1.date - mt2.date) FROM mytable mt1, mytable mt2')
(0,)
(0,)
…
因此,最终不可能使用带有的查询WHERE ABS(mt1.date - mt2.date) < 2来过滤最大2小时的日期时间差。
这该怎么做?
笔记:
detect_types=sqlite3.PARSE_DECLTYPES
确保查询返回一个datetypePython
对象,并且该查询正在运行。
借助以下DATE功能,它可以测试两个日期时间是否在同一天:
SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 WHERE DATE(mt1.date) = DATE(mt2.date)
回答:
这工作得益于JULIANDAY
它允许将日期时间差计算为浮点数:
SELECT ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) FROM mytable mt1, mytable mt2
因此,可以将2小时的差异转化为这种情况:
ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) < 0.083333因为2hrs / 24hrs = 1/12〜0.083333
该查询也可以正常工作:
SELECT ABS(STRFTIME("%s", mt1.date) - STRFTIME("%s", mt2.date)) FROM mytable mt1, mytable mt2
而2小时的条件是:
ABS(STRFTIME("%s", mt1.date) - STRFTIME("%s", mt2.date)) < 7200
即最大差异为7200秒(STRFTIME("%s", mt1.date)
给出Unix时间戳)。
以上是 SQLite datetime时差 的全部内容, 来源链接: utcz.com/qa/399183.html