Valor de fecha y hora incorrecto: ” 2012-07-14 23:00:00 ”

Estoy teniendo problemas con el formato de fecha y hora con Python / MySQL.

Calculo la fecha y hora usando el siguiente script (alimentado por un diccionario de Python):

tempDate = str(eachday.get("date").get("year")).zfill(4) + "-" + str(eachday.get("date").get("month")).zfill(2) + "-" + str(eachday.get("date").get("day")).zfill(2) + " " + str(eachday.get("date").get("hour")).zfill(2) + ":" + str(eachday.get("date").get("min")).zfill(2) + ":" + str(eachday.get("date").get("sec")).zfill(2) 

Lo que produce un valor que se parece al 2012-04-02 04:04:23 .

Puedo insertar en MySQL sin ningún problema.

 sql.execute("""INSERT INTO `db`.`table`(`id`, `fk_id`, `time`, `field1`, `field2`) VALUES (NULL, %s, %s, %s, %s);""", (fk_value, tempDate, value1, value2)) DB_CONN.commit() 

Pero cuando bash borrar algo con esa fecha y hora,

 sql.execute("""DELETE FROM `db`.`table` WHERE `time` = "%s";""", (tempDate)) DB_CONN.commit() 

devuelve una advertencia sobre un valor de fecha y hora incorrecto:

 Warning: Incorrect datetime value: ''2012-07-17 23:00:00'' for column 'time' at row 1 

¿Cómo puedo eliminar por fecha y hora en Python? Esto es especialmente confuso ya que la inserción de la misma variable (nada cambió) funciona perfectamente.

No puede incluir las comillas en "%s" en la cadena de consulta; el módulo mysqldb los agrega para usted (igual que en su INSERT donde no intenta poner comillas alrededor de los valores …)

Usted podría hacer uso fácilmente del módulo datetime , que es mucho más controlado para construir cadenas de fecha:

 from datetime import datetime eachday = { 'date': { 'day': 2, 'hour': 4, 'min': 4, 'month': 4, 'sec': 23, 'year': 2012 } } keys = ('year','month','day','hour','min','sec') dt = datetime(*(eachday['date'][k] for k in keys)) print dt.strftime('%Y-%m-%d %H:%M:%S') # '2012-04-02 04:04:23' 

El beneficio de quedarse con una fecha y hora, es que de todos modos es el formato nativo que obtendrá de MySQLdb. Y puedes pasarlo como un valor SIN conversiones. Entonces, realmente, el formato de la cadena de fecha ni siquiera es necesario.

 sql.execute("DELETE FROM `db`.`table` WHERE `time`=%s", (dt,)) 

Es mejor mantener el valor de fecha y hora como un objeto de fecha y hora el mayor tiempo posible, en lugar de transportar componentes int.