我正在尝试从一个SQLite数据库中提取一行,这些行是在一周的某一天和当天的某个小时。 当我打开我的sqlite浏览器并输入SQL时:
SELECT * FROM points
WHERE strftime('%H', checkintime) == '12'
AND strftime('%w', checkintime) == '1'
它可以工作,我收到了我应该收到的所有行。 但是,当我尝试在python中执行此操作时:
_points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?""", (time, day))
如果时间是12而日是1,则返回零结果。
更奇怪的是,当我更改execute
语句以使用硬编码值时,它可以正常工作。
我试图将我的变量强制转换为字符串和整数,但它仍然不行。 :(
有什么建议吗?
答案 0 :(得分:1)
我认为您必须将您的数字参数转换为字符串,否则它们将不会像您在sqlite中的语句中那样被引用。变量替换为?不引用数字。
您实际上在比较字符串,因此您必须将参数转换为字符串。
答案 1 :(得分:1)
时间和日期值确实需要是字符串。另外,我想知道你的'%'是否需要转义(使用%%) - 在pysqlite内部,?
占位符可能转换为%-style占位符,然后你的%H和%w会被误解。以下是否有效?
_points.execute("""SELECT * FROM points WHERE strftime('%%H', checkintime) == ? AND strftime('%%w', checkintime) == ?""", (str(time), str(day)))
答案 2 :(得分:0)
尝试这样: _points.execute(“”“SELECT * FROM points WHERE strftime('%H',checkintime)==?AND strftime('%w',checkintime)==?”“”%(时间,天))
注意%(时间,日期)
我不确定%H和%w,不知道什么是时间和日期格式
答案 3 :(得分:0)
如何处理执行调用之外的字符串格式?例如,
sql_statement = """SELECT * FROM points WHERE strftime('%s', checkintime) == %s AND strftime('%s', checkintime) == %s""" % ('%H', time, '%w', day)
_points.execute(sql_statement)
这应该避免执行语句无法完成的字符串映射。
祝你好运!