Вы, по сути, просите совета о том, как создать базу данных для повышения эффективности некоторых запросов. Это может быть довольно широко, но я постараюсь на этом простом примере.
Во-первых (и для вашего вопроса), тип 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 и потребует настройки, если вы используете другую базу данных.