2009-04-18 16 views
19

Una tabla de base de datos mysql tiene una columna cuyo tipo de datos es el tiempo (http://dev.mysql.com/doc/refman/5.0/en/time.html). Cuando se accede a los datos de la tabla, Python devuelve el valor de esta columna como un objeto datetime.timedelta. ¿Cómo puedo extraer el tiempo de esto? (Realmente no entendí para qué es Timedelta en los manuales de Python).Python: ¿Cómo obtengo el tiempo de un objeto datetime.timedelta?

E.g. La columna de la tabla contiene el valor "18:00:00" Python-MySQLdb vuelve esto como datetime.timedelta (0, 64800)


favor ignorar lo que está por debajo (lo hace volver valor diferente) -

Agregado: Independientemente del valor del tiempo en la tabla, python-MySQLdb parece solo devolver datetime.timedelta (0, 64800).

Nota: Yo uso de Python 2.4

Respuesta

28

Es extraño que Python devuelve el valor como datetime.timedelta. Probablemente debería devolver un datetime.time. De todos modos, parece que está regresando el tiempo transcurrido desde la medianoche (suponiendo que la columna en la tabla sea a las 6:00 PM). Con el fin de convertir a un datetime.time, puede hacer lo siguiente ::

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

datetime.datetime.min y datetime.time() son, por supuesto, documentado como parte del módulo datetime si desea más información.

A datetime.timedelta es, por cierto, una representación de la diferencia entre dos valores de datetime.datetime. Por lo tanto, si resta un datetime.datetime de otro, obtendrá un datetime.timedelta. Y si agrega un datetime.datetime con un datetime.timedelta, obtendrá un datetime.datetime. Así es como funciona el código anterior.

+3

Debo mencionar que mi primer intento fue utilizar 'datetime.time.min + value', pero esto no funciona, ya que los objetos' datetime.time' no se pueden agregar a los objetos 'datetime.timedelta'. –

+0

Python solo devuelve datetime.timedelta (0, 64800), independientemente del valor de tiempo real. – Sam

+1

Sí, me cansé de las diferentes formas en que se señalan las fechas y horas en diferentes capas de DB-API, diferentes versiones de MySQLdb y Python, e incluso diferentes bibliotecas disponibles (es decir, mxDateTime). Ahora solo uso enteros y tiempo de Unix. A menos que necesite hacer consultas basadas en el día de la semana o algo así, esto generalmente es mucho más fácil. – bobince

2

Me parece que el tipo de HORA en MySQL está destinado a representar intervalos de tiempo como hace datetime.timedelta en Python. De los documentos a los que hizo referencia:

Los valores de TIEMPO pueden oscilar entre '-838: 59: 59' y '838: 59: 59'. La parte de horas puede ser tan grande porque el tipo de TIEMPO se puede usar no solo para representar una hora del día (que debe ser inferior a 24 horas), sino también un tiempo transcurrido o un intervalo de tiempo entre dos eventos (que puede ser mucho mayor que 24 horas, o incluso negativo).

Una alternativa a la conversión de datetime.timedelta a datetime.time sería cambiar el tipo de columna a DATETIME y no usar los campos de fecha.

-Insertar:

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

: seleccione:

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() se llama en un objeto de fecha y hora para obtener un objeto de tiempo.

Cuestiones relacionadas