Python Sqlite日期时间时差
如何使用Python-SqlitePython Sqlite日期时间时差,python,datetime,sqlite,Python,Datetime,Sqlite,如何使用Python-Sqlitesqlite3module获取日期时间列相差
sqlite3
module获取日期时间列相差<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,)
... 因此,最终不可能使用带有
的查询,其中ABS(mt1.date-mt2.date)<2
按2小时最大日期时间差进行过滤
怎么做?
注:
确保查询返回一个detect\u types=sqlite3.PARSE\u DECLTYPES
Python对象,这是有效的datetype
- 这可以测试两个日期时间是否在同一天,这要归功于函数:
SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 WHERE DATE(mt1.date) = DATE(mt2.date)
SELECT ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) FROM mytable mt1, mytable mt2
因此,2小时的差异可以转化为这种情况:
ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) < 0.083333
2小时的条件是:
ABS(STRFTIME("%s", mt1.date) - STRFTIME("%s", mt2.date)) < 7200
ABS(STRFTIME(“%s”,mt1.date)-STRFTIME(“%s”,mt2.date))<7200
i、 e.最大7200秒的差异(
STRFTIME(“%s”,mt1.date)
给出Unix时间戳)。执行什么(c.execute('SELECT(mt1.date-mt2.date)从mytable mt1,mytable mt2')
返回(不带ABS
)`@pault它也返回0
。@Basj:这是因为将SQLite日期/时间字符串转换为数值只会得到年份,表中所有行的年份都是2018年(因此差值为0)。正如您已经发现的,您需要使用JULIANDAY
函数来获得有意义的答案。谢谢@dan04。好奇:是否有一个Unix时间戳函数可以允许执行ABS(UNIXTIMESTAMP(mt1.date)-UNIXTIMESTAMP(mt2.date))<7200
?@Basj:是的,它的拼写是STRFTIME(“%s”,日期)
.FWIW,ABS(STRFTIME(“%s”,mt1.date)-STRFTIME(“%s”,mt2.date))<7200
似乎比JULIANDAY
条件稍微慢一点。有人知道如何优化这些查询吗?旁注:这里有一种方法可以极大地提高查询的性能(提高50倍):
ABS(STRFTIME("%s", mt1.date) - STRFTIME("%s", mt2.date)) < 7200