日期时间值不正确:''2012-07-14 23:00:00''

时间:2012-07-08 23:19:06

标签: python mysql datetime

我在使用Python / MySQL时遇到了日期时间格式的问题。

我使用以下脚本计算日期时间(由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)

产生的值看起来像2012-04-02 04:04:23

我可以毫无问题地插入MySQL。

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

但是当我尝试删除具有该日期时间的任何内容时,

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

它会返回有关日期时间值不正确的警告:

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

如何在Python中按日期时间删除?这尤其令人困惑,因为插入相同的变量(没有任何改变)可以很好地工作。

2 个答案:

答案 0 :(得分:3)

您不能在查询字符串中的"%s"中包含引号; mysqldb模块为您添加它们(与INSERT中的相同,您不会尝试在值周围添加引号...)

答案 1 :(得分:2)

您可以轻松地使用datetime模块,该模块可以更好地控制构建日期字符串:

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'

坚持使用日期时间的好处是,无论如何,它将从MySQLdb获取本机格式。并且您可以将其作为没有转换的值传递。实际上,甚至不需要格式化日期字符串。

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

最好尽可能长时间地将datetime值保留为日期时间对象,而不是携带int组件。