我在MySQL表中有一个日期列。我想在此列中插入datetime.datetime()
对象。我应该在执行语句中使用什么?
我试过了:
now = datetime.datetime(2009,5,5)
cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))
我收到错误消息:"TypeError: not all arguments converted during string formatting"
我应该使用什么而不是%s
?
答案 0 :(得分:172)
对于时间字段,请使用:
import time
time.strftime('%Y-%m-%d %H:%M:%S')
我认为strftime也适用于datetime。
答案 1 :(得分:39)
您最有可能获得TypeError,因为您需要围绕datecolumn值的引号。
尝试:
now = datetime.datetime(2009, 5, 5)
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
("name", 4, now))
关于格式,我使用上面的命令(包括毫秒)成功,并且:
now.strftime('%Y-%m-%d %H:%M:%S')
希望这有帮助。
答案 2 :(得分:10)
尝试使用now.date()
获取Date
个对象而不是DateTime
。
如果这不起作用,那么将其转换为字符串应该有效:
now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))
答案 3 :(得分:2)
您要连接的数据库是什么?我知道Oracle可能对日期格式很挑剔,并且喜欢ISO 8601格式。
**注意:哎呀,我刚看到你在MySQL上。只需格式化日期并将其作为单独的直接SQL调用进行测试。
在Python中,您可以获得类似
的ISO日期now.isoformat()
例如,Oracle喜欢像
这样的日期insert into x values(99, '31-may-09');
根据您的数据库,如果是Oracle,您可能需要TO_DATE它:
insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));
TO_DATE的一般用法是:
TO_DATE(<string>, '<format>')
如果使用另一个数据库(我看到光标并想到Oracle;我可能错了),那么检查他们的日期格式工具。对于MySQL,它是DATE_FORMAT(),而SQL Server是CONVERT。
同样使用像SQLAlchemy这样的工具可以消除这些差异,让您的生活变得轻松。
答案 4 :(得分:0)
如果您只是使用python datetime.date(不是完整的datetime.datetime),只需将日期转换为字符串即可。这很简单,对我有用(mysql,python 2.7,Ubuntu)。列published_date
是MySQL日期字段,python变量publish_date
是datetime.date
。
# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
"link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
"VALUES(%s, %s, %s, %s, %s, %s, %s) ;"
sql_data = ( title, link, str(publish_date), \
author, posted_by, \
str(coco_id), str(link_id) )
try:
dbc.execute(sql_stmt, sql_data )
except Exception, e:
...
答案 5 :(得分:0)
使用Python方法datetime.strftime(format)
,其中格式= '%Y-%m-%d %H:%M:%S'
。
import datetime
now = datetime.datetime.utcnow()
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))
如果需要考虑时区,可以按如下所示为UTC设置MySQL时区:
cursor.execute("SET time_zone = '+00:00'")
可以在Python中设置时区:
now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
MySQL可以识别以下格式的DATETIME和TIMESTAMP值:
作为'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'中的字符串 格式。这里也允许使用“宽松”语法:任何标点符号 字符可用作日期部分或时间之间的分隔符 部分。例如,“ 2012-12-31 11:30:45”,“ 2012 ^ 12 ^ 31 11 + 30 + 45”, '2012/12/31 11 * 30 * 45'和'2012 @ 12 @ 31 11 ^ 30 ^ 45'是等效的。
在日期和时间部分与 小数秒部分是小数点。
日期和时间部分可以用T分隔而不是空格。对于 例如'2012-12-31 11:30:45''2012-12-31T11:30:45'是等效的。
作为字符串,在'YYYYMMDDHHMMSS'或 “ YYMMDDHHMMSS”格式,前提是该字符串可以作为日期使用。 例如,“ 20070523091528”和“ 070523091528”被解释为 '2007-05-23 09:15:28',但'071122129015'是非法的(它具有 无意义的分钟部分),并变为“ 0000-00-00 00:00:00”。
以YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字提供 该数字作为日期有意义。例如19830905132800和 830905132800被解释为“ 1983-09-05 13:28:00”。
答案 6 :(得分:0)
在进入t-sql时
这失败了:
select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)
这有效:
select CONVERT(datetime,'2019-09-13 09:04:35.823',21)
简便方法:
regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
"""Converts the datetime object to Splunk isoformat string."""
# 6-digits string.
microseconds = regexp.search(dt).group(1)
return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)