Python + Firebird动态SQL错误令牌未知

时间:2018-07-24 08:44:48

标签: python sql syntax-error firebird

当我连接到Firebird数据库并尝试执行查询时,它将引发此错误:

    "Error while preparing SQL statement:")
fdb.fbcore.DatabaseError: ('Error while preparing SQL statement:\n- SQLCODE: -104\n- Dynamic SQL Error\n- SQL error code = -104\n- Token unknown - line 27, column 113\n- )', -104, 335544569)

我的查询如下:

select distinct p.ID, p.DATE, p.PETITION, pac.KEY, ..., 
  pac.BIRTH_DATE, trunc(('today' - pac.BIRTH_DATE)/365.25) as AGE, p.NAME,...

我已经检查出错误的原因是:

trunc(('today' - pac.BIRTH_DATE)/365.25) as AGE

如果我从查询中将其删除,则可以正常运行。有人知道为什么吗?你能帮我吗?

我已经完成了@ain告诉我的事情:

trunc((cast(CURRENT_DATE - pac.BIRTH_DATE) as DOUBLE PRECISION)/365.25) as AGE

    "Error while preparing SQL statement:")
fdb.fbcore.DatabaseError: ('Error while preparing SQL statement:\n- SQLCODE: -104\n- Dynamic SQL Error\n- SQL error code = -104\n- Database SQL dialect 1 does not support reference to DATE datatype', -104, 335544569)

但这会导致相同的错误。另外,如果我尝试:

 DATEDIFF(YEAR from CURRENT_DATE to pac.BIRTH_DATE) as AGE

    "Error while preparing SQL statement:")
fdb.fbcore.DatabaseError: (
     'Error while preparing SQL statement:\n-
      SQLCODE: -104\n- 
      Dynamic SQL Error\n- 
      SQL error code = -104\n- 
      Database SQL dialect 1 does not support reference to DATE datatype',
   -104, 335544569)

最后,我通过以下方法解决了这个问题:

... trunc(DATEDIFF(DAY from cast(pac.BIRTH_DATE as DATE) to CURRENT_TIMESTAMP)/365.25) as AGE ...

我也会看一看方言。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您必须强制转换'today'到日期,否则它只是一个字符串文字。即使用

... trunc((cast('today' as date) - pac.BIRTH_DATE)/365.25) as AGE ...

您可能还想使用CURRENT_DATE,请参阅Firebird手册的Context variables主题。

您似乎想以“整年”计算年龄,因此可以使用DATEDIFF函数:

DATEDIFF(YEAR from CURRENT_DATE to pac.BIRTH_DATE)

答案 1 :(得分:0)

您不应该使用方言1。它在2000年的Interbase 6和Firebird 0.9中被废弃。唯一的目的是向后兼容与2000年之前的遗留应用程序的2000年之前的数据库服务器版本。在2018年,此目的几乎没有实际价值,因此“方言1”不仅会阻止您使用最新的语言和引擎增强功能,而且由于几乎没有现实世界的暴露,因此几乎没有进行室内测试,因此可能会造成彻底的错误。

您必须将数据库迁移到Dialect3。检查并消除数据库创建者可能引入的所有不兼容性,并在迁移过程中使用2000年前的语言对其进行编码。