Чтение даты и времени в sqlite3 - PullRequest
7 голосов
/ 13 декабря 2010

Я использую Python для создания базы данных sqlite3 в памяти со столбцом timestamp.Когда я использую min () или max () для этого столбца в моем запросе, столбец возвращается как строка, а не как объект даты и времени Python.Я прочитал предыдущий вопрос о Stackoverflow , который предоставил решение для обычных операторов SELECT, но он не работает, если используется max () или min ().Вот пример:

>>> db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
>>> c = db.cursor()
>>> c.execute('create table foo (bar integer, baz timestamp)')
<sqlite3.Cursor object at 0x7eff420e0be0>
>>> c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now()))
<sqlite3.Cursor object at 0x7eff420e0be0>
>>> c.execute('select * from foo')
<sqlite3.Cursor object at 0x7eff420e0be0>
>>> c.fetchall()
[(23, datetime.datetime(2010, 12, 14, 1, 15, 54, 685575))]
>>> c.execute('select max(baz) from foo')
<sqlite3.Cursor object at 0x7eff420e0be0>
>>> c.fetchall()
[(u'2010-12-14 01:15:54.685575',)]

Я пытался привести результат к метке времени, но он возвращает только год:

>>> c.execute('select cast(max(baz) as timestamp) from foo')
<sqlite3.Cursor object at 0x7eff420e0be0>
>>> c.fetchall()
[(2010,)]

Есть ли способ получить правильный объект datetime безвручную преобразовать строку с помощью datetime.strptime () после ее извлечения?

1 Ответ

14 голосов
/ 13 декабря 2010

Вы должны установить для dete_types значение sqlite.PARSE_COLNAMES и использовать as "foo [timestamp]" следующим образом:

import sqlite3
import datetime

db = sqlite3.connect(':memory:', detect_types = sqlite3.PARSE_COLNAMES)
c = db.cursor()
c.execute('create table foo (bar integer, baz timestamp)')
c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now()))
c.execute('insert into foo values(?, ?)', (42, datetime.datetime.now() + datetime.timedelta(-1)))
c.execute('select bar, baz as "ts [timestamp]" from foo')
print c.fetchall()
c.execute('select max(baz) as "ts [timestamp]" from foo')
print c.fetchall()

Сделал хороший маленький поиск Google и нашел это сообщение .

...