我正在使用使用Firebird进行数据存储的软件.我使用Python和FDB库来处理Firebird.我try 获取指定日期范围内的所有记录,但FDB对我的所有try 都提出了不同的例外.

日期的数据类型为-时间戳,以数据库为单位

try 1:

'SELECT * FROM table WHERE date BETWEEN "2023-07-14" AND "2023-05-08"'

例外:('Error while preparing SQL statement:\n- SQLCODE: -206\n- Dynamic SQL Error\n- SQL error code = -206\n- Column unknown\n- 2023-07-16\n- At line 1, column 73', -206, 335544569)

try 2:

'SELECT * FROM table WHERE date BETWEEN "2023-07-14 09:00" AND "2023-05-08 17:00"'

此try 中的异常等于try 1中的异常

try 3:

'SELECT * FROM table WHERE date BETWEEN %s AND %s"' % (datetime.datetime(2023, 7, 16, 9), datetime.datetime(2023, 5, 8, 17)) 

例外:('Error while preparing SQL statement:\n- SQLCODE: -104\n- Dynamic SQL Error\n- SQL error code = -104\n- Token unknown - line 2, column 48\n- 09', -104, 335544569)

我在谷歌上搜索,没有找到关于这个问题的信息.我也try 过使用CAST()来转换类型,但这并不管用.

据我所知,问题出在日期类型上.

因为此请求有效:

'SELECT * FROM table WHERE date = CURRENT_TIMESTAMP'

这个请求不起作用:

'SELECT * FROM table WHERE date = "2023-07-16 22:00:00.000"'

推荐答案

问题是,在SQL中(在Firebird和ISO/IEC 9075-2标准中),双引号中的内容是identifiers(例如列名),而不是值.这就是为什么这会产生"Column unknown"错误.

只有在方言1数据库中才能使用双引号将字符串literals括起来,从2000年开始就不推荐使用这种方法,不应该再使用了,从错误判断,您使用的是方言3.您需要用单引号将字符串文字括起来.

换句话说,您需要使用BETWEEN '2023-07-14' AND '2023-05-08'(或者更好的是,BETWEEN date '2023-07-14' AND date '2023-05-08'BETWEEN timestamp '2023-07-14' AND timestamp '2023-05-08',以使类型显式

另外,永远不要使用像你第三次try 那样的解决方案.这样的字符串内插本质上是一种SQL注入形式,如果您的值来自未经清理的来源(例如用户输入),您将在应用程序中创建一个安全漏洞.出现该错误的实际原因是您的值没有用单引号引起来.如果要使用参数化查询,请使用实际参数(?),并通过将值作为元组传递作为execute的第二个参数来执行它们.

顺便说一句,FDB不再维护,已由firebird-driver取代,您可能需要考虑升级到该驱动程序.

Python相关问答推荐

将数组操作转化为纯numpy方法

try 从网站获取表(ValueRight:如果使用所有纯量值,则必须传递索引)

不同数据类型的Python成员变量不会在具有相同优先级的不同线程中更新

使用itertools出现第n个子串

避免循环的最佳方法

剧作家Python没有得到回应

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

如果条件为真,则Groupby.mean()

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

图像 pyramid .难以创建所需的合成图像

如何使用pytest来查看Python中是否存在class attribution属性?

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

根据列值添加时区

字符串合并语法在哪里记录

如何在turtle中不使用write()来绘制填充字母(例如OEG)

无法连接到Keycloat服务器

Python中的变量每次增加超过1

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

lityter不让我输入左边的方括号,'

处理具有多个独立头的CSV文件