2009-04-18 3 views
19

Una tabella di database mysql ha una colonna il cui tipo di dati è il tempo (http://dev.mysql.com/doc/refman/5.0/en/time.html). Quando si accede ai dati della tabella, Python restituisce il valore di questa colonna come oggetto datetime.timedelta. Come estrarre il tempo da questo? (Non ho davvero capito a cosa serve timedelta dai manuali di python).Python: come ottengo il tempo da un oggetto datetime.timedelta?

E.g. La colonna della tabella contiene il valore "18:00:00" Python MySQLdb restituisce questo come datetime.timedelta (0, 64800)


Si prega di ignorare ciò che è al di sotto (lo fa ritornare valore diverso) -

Aggiunto: Indipendentemente dal valore temporale nella tabella, python-MySQLdb sembra restituire solo datetime.timedelta (0, 64800).

Nota: io uso Python 2.4

risposta

28

È strano che Python restituisce il valore come datetime.timedelta. Probabilmente dovrebbe restituire un datetime.time. Ad ogni modo, sembra che stia tornando il tempo trascorso da mezzanotte (supponendo che la colonna nella tabella sia le 6:00 PM). Al fine di convertire in un datetime.time, è possibile effettuare le seguenti operazioni ::

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

datetime.datetime.min e datetime.time() sono, ovviamente, documentato come parte del modulo datetime se volete maggiori informazioni.

A datetime.timedelta è, a proposito, una rappresentazione della differenza tra due valori datetime.datetime. Quindi se sottrai uno datetime.datetime da un altro, riceverai un datetime.timedelta. E se aggiungi uno datetime.datetime con uno datetime.timedelta, riceverai uno datetime.datetime. Ecco come funziona il codice sopra.

+3

Dovrei menzionare che il mio primo tentativo era di usare 'datetime.time.min + value', ma questo non funziona, poiché gli oggetti' datetime.time' non possono essere aggiunti agli oggetti 'datetime.timedelta'. –

+0

Python restituisce solo datetime.timedelta (0, 64800), indipendentemente dal valore temporale effettivo. – Sam

+1

Sì, mi sono stufato dei diversi modi in cui le date e gli orari sono segnalati attraverso diversi livelli DB-API, diverse versioni di MySQLdb e Python e persino diverse librerie disponibili (ad esempio mxDateTime). Ora uso solo gli interi e il tempo Unix. A meno che non sia necessario eseguire query in base al giorno della settimana o qualcosa del genere, questo è generalmente molto più semplice. – bobince

2

Mi sembra che il tipo TIME in MySQL sia destinato a rappresentare intervalli di tempo come datetime.timedelta in Python. Dai documenti cui si fa riferimento:

I valori TIME possono variare da '-838: 59: 59' a '838: 59: 59'. La parte delle ore può essere così grande perché il tipo TIME può essere utilizzato non solo per rappresentare un orario del giorno (che deve essere inferiore a 24 ore), ma anche il tempo trascorso o un intervallo di tempo tra due eventi (che può essere molto maggiore di 24 ore o addirittura negativo).

Un'alternativa alla conversione da datetime.timedelta a datetime.time consiste nel modificare il tipo di colonna in DATETIME e non utilizzare i campi data.

-Inserire:

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

-Selezionare:

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() viene chiamato su un oggetto datetime per ottenere un oggetto di tempo.