如何使用Python Sqlitesqlite3模块获取具有小于2小时的datetime列的行?
我尝试了这个:
import sqlite3, datetime db = 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对象,并且该查询正在运行。
detect_types=sqlite3.PARSE_DECLTYPES
datetypePython
借助以下DATE功能,它可以测试两个日期时间是否在同一天:
SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 WHERE DATE(mt1.date) = DATE(mt2.date)
这工作得益于JULIANDAY它允许将日期时间差计算为浮点数:
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时间戳)。
(STRFTIME("%s", mt1.date)