Python+Firebird动态SQL错误标记未知

2024-09-27 22:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

当我连接到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)

我的查询如下:

^{pr2}$

我查过错误的原因是:

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

如果我从查询中删除它,它就可以完美地工作了。有人知道为什么吗?你能帮帮我吗?在

我做了艾恩告诉我的事:

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 ...

我也来看看方言。非常感谢你的帮助!在


Tags: toagesqldateas错误errorstatement
2条回答

你不应该用方言1。2000年,随着Interbase6和Firebird 0.9的发布,它被淘汰了。它的唯一目的是与2000年以前的数据库服务器版本向后兼容,用于2000年以前的遗留应用程序。在2018年,这个目的几乎没有实际价值,因此方言1不仅阻止您使用最新的语言和引擎增强功能,而且可能是由于几乎没有真实世界的暴露,因此很少进行外部测试。在

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

您必须将'today'转换为最新值,否则它只是一个字符串文本。Ie使用

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

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

您似乎希望以“全年”为单位计算年龄,因此可以使用DATEDIFF函数进行计算:

^{pr2}$

相关问题 更多 >

    热门问题