sqlite3 datetime.datetime python选择

时间:2019-01-04 17:48:00

标签: python datetime sqlite python-datetime

sqlite3数据库有成千上万的行。我想按(datetime.datetime(now))

的列对它进行排序

该表可能是:

c.execute(“CREATE TABLE IF NOT EXISTS table_one (time_column TEXT,column_two REAL,column_three REAL)”)

time列为TEXT

插入效果很好,我有成千上万的行。我需要按时间查看数据。例如,“ 2019年1月3日凌晨1:00和2:00之间的平均偏差和标准偏差是多少”(大约300个数字)

类似这样的东西:

all_rows =  c.execute('SELECT  column_two   FROM table_one WHERE time_column >  2019-01-03  01:00:00:000000  and time_column <  2019-01-03  02:00:00:000000  ‘)

fetchall需要进入数组以进行统计分析,但这是另一个问题。

目前,可以恢复datetime。它以unicode(无论是什么形式)的形式出现

但是我需要使用datetime字段进行决策。 TEXT有问题吗?我可以添加一列,并将date stamp更改为似乎是海峡数字的“ unix时间戳”。

我正在学习越来越多的东西,但是坚持下去……。帮助(谢谢)

1 个答案:

答案 0 :(得分:0)

您实质上是在寻求有关如何设计数据库以提高某些请求的效率的建议。可能范围很广,但我将尝试这个简单的示例。

首先(也是您的问题),对于没有专用日期类型的SQLite,时间列的TEXT类型是可接受的。日期将转换为ISO8601字符串(“ YYYY-MM-DD HH:MM:SS.SSS”),以确保与比较运算符兼容。要问的好问题是日期值的范围是多少,以及是否需要评估日期差。如果您只需要一秒的精度且日期大于1970-01-01,则INTEGER(自1970-01-01 00:00:00 UTC以来的秒数)很好,而REAL(Julian天数)如果满足精确的精度无关紧要(因为浮点数不准确),但是需要很大的范围。

但是对于查询效率而言最重要的是索引的存在。因此,如果您需要使用time_column改进查询,请在其上声明一个索引。您的代码可能变为:

c.execute("CREATE TABLE IF NOT EXISTS table_one (time_column TEXT,column_two REAL,"
           "column_three REAL)")
c.execute("CREATE INDEX IF NOT EXISTS index_time_table_one ON table_one(time_column)")

和选择部分将是:

curs = c.execute("SELECT  column_two   FROM table_one WHERE time_column"
                 "BETWEEN '2019-01-03 01:00:00'  and '2019-01-03 02:00:00'")

以这种方式,当您获取time_column列时,将获得ISO字符串表示形式。

Python SQLite3模块甚至可以更智能地显示日期,并且可以自动将其转换为时间戳,只要您提出以下要求即可:

# declare that you want to use custom datatypes, declare in columns
c = sqlite3.connect('your_db', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
# declare the time_column to be a timestamp:
c.execute("CREATE TABLE IF NOT EXISTS table_one (time_column timestamp,column_two REAL,"
           "column_three REAL)")
# declare the index
c.execute("CREATE INDEX IF NOT EXISTS index_time_table_one ON table_one(time_column)")

填充数据库后,您可以照常获取它并直接检索Python datetime对象:

curs = c.execute("SELECT * FROM table_one WHERE time_column BETWEEN"
                 " '2019-01-03 01:00:00'  and '2019-01-03 02:00:00'")
r = curs.fetchone()
print(r)

将输出:

(datetime.datetime(2019, 1, 2, 0, 0), ...)

缺点是不再是标准SQL,如果您使用其他数据库,则需要进行调整。