2010-12-13 13 views
7

Estoy usando Python para crear una base de datos sqlite3 en memoria con una columna de marca de tiempo. Cuando uso min() o max() en esta columna en mi consulta, la columna se devuelve como una cadena en lugar de un objeto datetime de Python. Leí un previous question on Stackoverflow que proporcionaba una solución para las sentencias SELECT normales, pero no funciona si se usa max() o min(). He aquí un ejemplo:Lectura de una fecha y hora en sqlite3

>>> 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',)] 

Probé a emitir el resultado de una marca de tiempo, pero sólo devuelve el año:

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

¿Hay alguna manera de captar un objeto de fecha y hora correcta, sin necesidad de convertir manualmente la cadena usando datetime.strptime() después de ir a buscarlo?

Respuesta

13

usted tiene que fijar detect_types a sqlite.PARSE_COLNAMES y utilizar as "foo [timestamp]" así:

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() 

hicieron un buen poco de búsqueda en Google y encontró this message.

+0

¡Trabaja para mí, gracias! – del

Cuestiones relacionadas