一尘不染

SQLite datetime时差

python

如何使用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对象,并且该查询正在运行。

借助以下DATE功能,它可以测试两个日期时间是否在同一天:

SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 WHERE DATE(mt1.date) = DATE(mt2.date)

阅读 436

收藏
2021-04-10

共1个答案

一尘不染

这工作得益于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时间戳)。

2021-04-10