使用STR_TO_DATE()和占位符时出错

时间:2016-04-17 14:39:19

标签: python mysql python-3.x

以下是我尝试使用的查询:

sql= """SELECT APPT_NBR, STR_TO_DATE(APPT_SCHD_ARVL_TS,'%M/%D/%Y')AS Schd,
                         STR_TO_DATE(APPT_ACTL_ARVL_TS,'%M/%D/%Y) AS actl,
        DEST_LOC_NBR, CARRIER_TYP_NBR,
        VND_NBR, VND_NBR_SUPPLIER, APPT_TYP_NBR, APPT_NBR_OF_CNTRS
        FROM mixeddata            
        WHERE DEST_LOC_NBR= (%s)"""

c.execute(sql, loc_nbr)

它一直在抛出这个错误:

 File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/cursors.py", line 105, in execute
    query = query % escaped_args
ValueError: unsupported format character 'M' (0x4d) at index 95

如果我没有为DEST_LOC_NBR使用占位符,则不会出现错误。如果我只是把DEST_LOC_NBR = 3950,那么查询就可以了。但我想在我的代码中使用该位置的变量。

1 个答案:

答案 0 :(得分:1)

%格式的'%M/%D/%Y'字符在Python级别进行解释,然后string formatting operation会抱怨没有M格式(它会执行相同的操作) %D%Y)。

%加倍以转义它们(单%个字符将被发送到数据库):

'%%M/%%D/%%Y'

完整的字符串定义将是

sql= """SELECT APPT_NBR, STR_TO_DATE(APPT_SCHD_ARVL_TS,'%%M/%%D/%%Y')AS Schd,
                         STR_TO_DATE(APPT_ACTL_ARVL_TS,'%%M/%%D/%%Y) AS actl,
        DEST_LOC_NBR, CARRIER_TYP_NBR,
        VND_NBR, VND_NBR_SUPPLIER, APPT_TYP_NBR, APPT_NBR_OF_CNTRS
        FROM mixeddata            
        WHERE DEST_LOC_NBR= (%s)"""