sqlite3 datetime.datetime python select - PullRequest
       17

sqlite3 datetime.datetime python select

0 голосов
/ 04 января 2019

База данных sqlite3 - это сотни тысяч строк. Я хочу отсортировать по столбцу с (datetime.datetime(now))

Таблица может быть:

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

Столбец time равен TEXT

Вставки работали нормально, и у меня есть сотни тысяч строк. Мне нужно посмотреть на данные по времени. Например, «каково среднее и стандартное отклонение на 3 января 2019 года с 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 голосов
/ 04 января 2019

Вы, по сути, просите совета о том, как создать базу данных для повышения эффективности некоторых запросов. Это может быть довольно широко, но я постараюсь на этом простом примере.

Во-первых (и для вашего вопроса), тип TEXT для столбца времени приемлем для SQLite, у которого нет выделенного типа Date. Дата преобразуется в строки ISO8601 («ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС»), что обеспечивает совместимость с операторами сравнения. Хорошие вопросы, которые следует задать, - это какой диапазон значений даты и нужно ли вам оценивать разницу в датах. Если вам нужна точность только в одну секунду с датами, превышающими 1970-01-01, тогда INTEGER (количество секунд с 1970-01-01 00:00:00 UTC) - это хорошо, а REAL (числа в юлианских днях) - хорошо, если Точная точность не имеет значения (из-за неточностей с плавающей запятой), но требуется большой диапазон.

Но для эффективности запросов важнее всего наличие индекса. Поэтому, если вам нужно улучшить запросы, используя 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'")

Таким образом, вы получите строковые представления ISO при извлечении столбца time_column.

Модуль 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:

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 и потребует настройки, если вы используете другую базу данных.

...