如何获取具有<日期时间列的行?使用Python Sqlite sqlite3
模块2小时的差异?
我试过了:
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
确保查询返回datetype
Python对象,这样做有效。
这可以测试2个日期时间是否是同一天,感谢DATE
函数:
SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 WHERE DATE(mt1.date) = DATE(mt2.date)
答案 0 :(得分: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
自2小时/ 24小时= 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时间戳)。