Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sqlite日期时间时差_Python_Datetime_Sqlite - Fatal编程技术网

Python Sqlite日期时间时差

Python Sqlite日期时间时差,python,datetime,sqlite,Python,Datetime,Sqlite,如何使用Python-Sqlitesqlite3module获取日期时间列相差

如何使用Python-Sqlite
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
    确保查询返回一个
    datetype
    Python对象,这是有效的

  • 这可以测试两个日期时间是否在同一天,这要归功于函数:

    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