2010-12-13 33 views
7

J'utilise Python pour créer une base de données sqlite3 en mémoire avec une colonne timestamp. Lorsque j'utilise min() ou max() sur cette colonne dans ma requête, la colonne est renvoyée en tant que chaîne plutôt qu'en tant qu'objet datetime Python. J'ai lu un previous question on Stackoverflow qui fournissait une solution pour les instructions SELECT normales, mais cela ne fonctionne pas si max() ou min() est utilisé. Voici un exemple:Lecture d'un datetime dans 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',)] 

J'ai essayé de jeter le résultat d'un horodatage, mais il ne retourne que l'année:

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

Est-il possible d'aller chercher un objet datetime approprié, sans convertir manuellement la chaîne en utilisant datetime.strptime() après l'avoir récupéré?

Répondre

13

Vous devez définir detect_types à sqlite.PARSE_COLNAMES et utiliser as "foo [timestamp]" comme ceci:

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

fait une recherche Google peu agréable et trouvé this message.

+0

Fonctionne pour moi, merci! – del