将Python日期时间.datetime对象插入MySQL

jjhzyzn0  于 2022-10-31  发布在  Mysql
关注(0)|答案(9)|浏览(149)

我在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

ki0zmccv

ki0zmccv1#

对于时间字段,请用途:

import time    
time.strftime('%Y-%m-%d %H:%M:%S')

我认为strftime也适用于datetime

2ledvvac

2ledvvac2#

您很可能会得到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')

希望这对你有帮助。

0pizxfdo

0pizxfdo3#

请尝试使用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))
e4yzc0pl

e4yzc0pl4#

使用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')))

时区数
如果需要考虑时区,可以将MySQL时区设置为UTC,如下所示:

cursor.execute("SET time_zone = '+00:00'")

时区可以在Python中设置:

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)

MySQL Documentation(第一个字母)

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 1130 45”和“2012@12@31 11^30^45”是等效的。
在日期和时间部分与小数秒部分之间唯一可识别的分隔符是小数点。
日期和时间部分可以用T分隔,而不是用空格分隔。例如,'2012-12-31 11:30:45'和'2012-12- 31 T11: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”。

p1iqtdky

p1iqtdky5#

您正在连接到什么数据库?我知道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这样的工具也可以消除这些差异,让你的生活变得轻松。

yptwkmov

yptwkmov6#

如果你使用的是python datetime.date(不是完整的datetime.datetime),只需将日期转换为字符串即可。这非常简单,对我也适用(mysql,python 2.7,Ubuntu)。列published_date是MySQL的日期字段,python变量publish_datedatetime.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:
    ...
jv2fixgn

jv2fixgn7#

dt= datetime.now()

    query = """INSERT INTO table1(python_Date_col)
               VALUES (%s)
            """
    conn = ...... # Connection creating process
    cur = conn.cursor()
    cur.execute(query,(dt))

上述代码将失败,因为“datetime.now()”会生成“datetime.datetime(2014,2,11,1,16)”作为参数值以插入语句。
使用以下方法捕获提供字符串值的日期时间。

dt= datetime.now().strftime("%Y%m%d%H%M%S")

我能够成功地运行更改后的代码...

y1aodyip

y1aodyip8#

例如,日期为5/5/22,请将其转换为mysql日期格式2022-05-05,以便在mysql数据库中插入记录%m月%d日%Y年(4位数)%y 2位数
代码如下:

from datetime import datetime
now='5/5/22'
print("Before", now)
now= datetime.strptime(dob,'%m/%d/%y').strftime('%Y-%m-%d')
print("After", now)
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",(name, 4,now))

输出量:
2022年5月5日前
2022年5月5日之后
(mysql格式,你可以很容易地插入到数据库中)x1c 0d1x

fjnneemd

fjnneemd9#

插入到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)

相关问题