1

我正在尝试从 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语句更改为使用硬编码值时,它起作用了。

我试图将我的 var 类型转换为字符串和整数,但仍然不行。:(

有什么建议么?

4

4 回答 4

1

我认为您必须将您的数字参数转换为字符串,否则它们不会像您在 sqlite 中的语句中那样被引用。变量替换为 ? 不引用数字。

您实际上是在比较字符串,因此您必须将参数转换为字符串。

于 2011-03-01T09:14:04.863 回答
1

时间和日期值确实需要是字符串。另外,我想知道您的 '%' 是否需要转义(使用 %%)——在 pysqlite 内部,?占位符可能会转换为 % 样式的占位符,然后您的 %H 和 %w 会被误解。下面的工作吗?

_points.execute("""SELECT * FROM points WHERE strftime('%%H', checkintime) == ? AND strftime('%%w', checkintime) == ?""", (str(time), str(day)))
于 2011-03-01T09:56:54.430 回答
0

试试这样: _points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?""" % (time, day) )

注意%(时间、日期)

我不确定 %H 和 %w ,不知道时间和日期格式是什么

于 2011-03-01T09:14:30.057 回答
0

您如何处理执行调用之外的字符串格式?例如,

sql_statement = """SELECT * FROM points WHERE strftime('%s', checkintime) == %s AND strftime('%s', checkintime) == %s""" % ('%H', time, '%w', day)

_points.execute(sql_statement)

这应该避免执行语句无法完成的字符串映射。

祝你好运!

于 2011-05-04T08:15:48.987 回答