2009-04-18 3 views
19

Eine MySQL-Datenbanktabelle hat eine Spalte mit dem Datentyp time (http://dev.mysql.com/doc/refman/5.0/en/time.html). Wenn auf die Tabellendaten zugegriffen wird, gibt Python den Wert dieser Spalte als datetime.timedelta-Objekt zurück. Wie extrahiere ich die Zeit dafür? (Ich habe nicht wirklich verstanden, was Timedelta für die Python-Handbücher bedeutet).Python: Wie bekomme ich Zeit von einem datetime.timedelta Objekt?

z. Die Spalte in der Tabelle enthält den Wert „18.00.00“ Python-MySQLdb gibt diese als datetime.timedelta (0, 64800)


Bitte ignorieren, was unten ist (es tut anderen Wert zurück) -

Hinzugefügt: Unabhängig vom Zeitwert in der Tabelle scheint python-MySQLdb nur datetime.timedelta (0, 64800) zurückzugeben.

Hinweis: Ich verwende Python 2.4

Antwort

28

Es ist seltsam, dass Python den Wert als datetime.timedelta zurückgibt. Es sollte wahrscheinlich eine datetime.time zurückgeben. Wie auch immer, es sieht so aus, als ob es die verstrichene Zeit seit Mitternacht zurückgibt (vorausgesetzt, die Spalte in der Tabelle ist 18:00 Uhr). Um eine datetime.time zu konvertieren, können Sie die folgende ::

value = datetime.timedelta(0, 64800) 
(datetime.datetime.min + value).time() 

datetime.datetime.min und datetime.time() sind natürlich tun, als Teil des datetime Modul dokumentiert, wenn Sie weitere Informationen wünschen. Eine datetime.timedelta ist übrigens eine Darstellung des Unterschieds zwischen zwei datetime.datetime Werten. Wenn Sie also eine datetime.datetime von einer anderen subtrahieren, erhalten Sie eine datetime.timedelta. Und wenn Sie eine datetime.datetime mit einer datetime.timedelta hinzufügen, erhalten Sie eine datetime.datetime. So funktioniert der obige Code.

+3

Ich sollte erwähnen, dass mein erster Versuch war, "datetime.time.min + value" zu verwenden, aber dies funktioniert nicht, da 'datetime.time' Objekte nicht zu' datetime.timedelta' Objekten hinzugefügt werden können. –

+0

Python gibt nur datetime.timedelta (0, 64800) zurück, unabhängig vom tatsächlichen Zeitwert. – Sam

+1

Ja, ich hatte genug von den verschiedenen Möglichkeiten, wie Daten und Zeiten über verschiedene DB-API-Ebenen, verschiedene Versionen von MySQLdb und Python und sogar über verschiedene verfügbare Bibliotheken (z. B. mxDateTime) signalisiert werden. Jetzt verwende ich nur Integer und Unix-Zeit. Wenn Sie keine Abfragen basierend auf dem Wochentag oder etwas benötigen, ist dies im Allgemeinen viel einfacher. – bobince

2

Es scheint mir, dass der TIME-Typ in MySQL soll Zeitintervalle darstellen wie datetime.timedelta in Python tut. Aus den von Ihnen referenzierten Dokumenten:

Die TIME-Werte können zwischen '-838: 59: 59' und '838: 59: 59' liegen. Der Stundenabschnitt kann so groß sein, da der TIME-Typ nicht nur zur Darstellung einer Tageszeit (die weniger als 24 Stunden sein muss), sondern auch der verstrichenen Zeit oder eines Zeitintervalls zwischen zwei Ereignissen (die viel größer als sein können) verwendet werden kann 24 Stunden oder sogar negativ).

Eine Alternative von datetime.timedelta zu datetime.time zur Umwandlung des Spaltentyp DATETIME- und nicht mit den Datumsfeldern zu ändern wäre.

-Einfüge:

tIn = datetime.datetime(
    year=datetime.MINYEAR, 
    month=1, 
    day=1, 
    hour=10, 
    minute=52, 
    second=10 
    ) 
cursor.execute('INSERT INTO TableName (TimeColumn) VALUES (%s)', [tIn]) 

-Select:

cursor.execute('SELECT TimeColumn FROM TableName') 
result = cursor.fetchone() 
if result is not None: 
    tOut = result[0].time() 
    print 'Selected time: {0}:{1}:{2}'.format(tOut.hour, tOut.minute, tOut.second) 

datetime.time() auf einem Datetime-Objekt namens Objekt eine Zeit zu bekommen.