将INSERT切换为REPLACE使DATE_SUB()结果无效

2024-09-28 19:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在unique key上使用了以下查询:

insert_post = ("""INSERT IGNORE INTO posts 
                SET internal = %s,
                    schedule_date = DATE_SUB(%s, INTERVAL 2 HOUR)
               """)

当我将查询切换到REPLACEON DUPLICATE KEY UPDATE时,就会出现以下错误:

mysql.connector.errors.DataError: 1292 (22007): Truncated incorrect datetime value: '2017-08-19T12:45:00-0500'

我知道传入值格式与MySQL datetime列不兼容,但在我的初始INSERT中似乎没有问题。你知道吗

你知道我遗漏了什么吗?你知道吗

这里有一个SQL fiddle,但是面板不会运行DDL/DML,所以不要期望更多的模式:http://sqlfiddle.com/#!9/656a3/2

Edit:这里是工作的SQLfiddle,显示复制的错误:http://sqlfiddle.com/#!9/c13f45/1


Tags: keycomhttpdatetime错误postinternalposts
2条回答

所以在玩了一番之后,替换和插入忽略的行为就不同了。insert将截断数据,但仍然insert。替代品将彻底失效。你知道吗

您必须为这个@eht使用正确的日期时间格式。你知道吗

为了提供更多的信息,insert ignore抛出了一个关于数据被截断的警告。replace抛出错误并停止执行。你知道吗

“INSERT IGNORE”能够忽略抛出的警告,并使用格式正确的datetime完成插入。你知道吗

REPLACE无法忽略格式错误的时间戳,并将导致错误:

mysql.connector.errors.DataError: 1292 (22007): Truncated incorrect datetime value: '2017-08-19T12:45:00-0500'

解决方案包括FROM_UNIXTIME()包装传入的时间戳解析并重新组织时间戳,如下所示:

schedule_date = datetime.datetime.strptime(item['scheduleDate'], "%Y-%m-%dT%H:%M:%S-%f") # 2017-06-27T08:30:00-0500 -> # 2017-06-27T08:30:00.050000
formatted_schedule_date = schedule_date.strftime('%Y-%m-%d %H:%M:%S')

工作REPLACE查询如下所示:

INSERT IGNORE INTO posts 
                SET internal = 1,
                    schedule_date = DATE_SUB(%s, INTERVAL 2 HOUR)

相关问题 更多 >