Sqlite日期时差

时间:2018-04-16 19:53:08

标签: python datetime sqlite

如何获取具有<日期时间列的行?使用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)
    

1 个答案:

答案 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时间戳)。