我在使用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中按日期时间删除?这尤其令人困惑,因为插入相同的变量(没有任何改变)可以很好地工作。
答案 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组件。