我有一个基于字符串字段进行过滤的查询,字符串字段中包含前导零的电话号码。我的查询使用 %s
作为一个占位符,执行时传递给查询的变量为so。
rows = (('01234567891',), ('01234567892',), ('01234567893',))
dbQuery2 = """
SELECT DATE_FORMAT(DATE(ch.start), '%d/%m/%Y') As CallDate,
ch.did AS InboundNo,
COUNT(*) AS DayTotal
FROM call_history ch LEFT JOIN
ast_queue_log aql
ON aql.event = 'ENTERQUEUE' AND aql.callid = ch.callid
WHERE ch.did = %s AND
ch.start BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND NOW()
GROUP BY ch.did, DATE(ch.start)
ORDER BY ch.did, DATE(ch.start)
;
"""
for row in rows:
cur2.execute(dbQuery2, row)
subrows = cur.fetchall()
引起问题的DB字段是:
`did` varchar(32) NOT NULL DEFAULT '',`
错误是:
TypeError: %d format: a number is required, not str
这里的问题是 DATE_FORMAT
字符串在SQL查询中。的 %d
, %m
和 %Y
被解释为变量占位符,MySQLdb引擎试图在那里替换变量,而不是在 WHERE
子句。
通过在查询中使用以下格式进行修正。
dbQuery2 = """
SELECT DATE_FORMAT(DATE(ch.start), '%%d/%%m/%%Y') As CallDate,
ch.did AS InboundNo,
COUNT(*) AS DayTotal
FROM call_history ch LEFT JOIN
ast_queue_log aql
ON aql.event = 'ENTERQUEUE' AND aql.callid = ch.callid
WHERE ch.did = %s AND
ch.start BETWEEN DATE_FORMAT(NOW(), '%%Y-%%m-01') AND NOW()
GROUP BY ch.did, DATE(ch.start)
ORDER BY ch.did, DATE(ch.start)
;
"""