2010-12-13 6 views
7

Ich benutze Python, um eine sqlite3-Datenbank im Speicher mit einer Timestamp-Spalte zu erstellen. Wenn ich min() oder max() für diese Spalte in meiner Abfrage verwende, wird die Spalte als String und nicht als Python-Datetime-Objekt zurückgegeben. Ich las eine previous question on Stackoverflow, die eine Lösung für normale SELECT-Anweisungen zur Verfügung stellte, aber es funktioniert nicht, wenn max() oder min() verwendet wird. Hier ein Beispiel:Zurücklesen einer Datetime in 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',)] 

Ich habe versucht, das Ergebnis zu einem Zeitstempel zu werfen, aber es gibt nur das Jahr:

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

Gibt es eine Möglichkeit, ein richtiges Datetime-Objekt zu holen, ohne manuell die Zeichenfolge zu konvertieren Verwenden Sie datetime.strptime() nach dem Abrufen?

Antwort

13

Sie haben detect_types zu sqlite.PARSE_COLNAMES setzen und as "foo [timestamp]" wie folgt verwenden:

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

eine nette kleine Google-Suche gemacht und gefunden this message.

+0

Funktioniert für mich, danke! – del