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

Python+;Firebird动态SQL错误令牌未知,python,sql,syntax-error,firebird,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- )

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

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

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

... trunc((cast('today' as date) - pac.BIRTH_DATE)/365.25) as AGE ...
您可能还想使用当前日期,请参阅Firebird手册的主题

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

DATEDIFF(YEAR from CURRENT_DATE to pac.BIRTH_DATE)

你不应该使用方言1。它在2000年随着Interbase 6和Firebird 0.9的发布而过时。它的唯一目的是为2000年以前的遗留应用程序向后兼容2000年以前的数据库服务器版本。在2018年,这一目的几乎没有实际价值,因此方言1不仅会阻止您使用最新的语言和引擎增强功能,而且可能会因为很少接触真实世界而导致完全错误,因此很少进行室外测试

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


您是否注意到错误现在有所不同:
“数据库SQL方言1不支持对日期数据类型的引用”
。为什么使用方言1?最后一个问题应该通过使用
CURRENT_TIMESTAMP
而不是
CURRENT_DATE
来解决,方言1数据类型
DATE
实际上是一个时间戳,因此
CURRENT_DATE
不起作用,因为方言1的数据类型未知。您好@markveerottel谢谢您的评论,它解决了这个问题!鉴于op使用方言1,应避免使用
CURRENT\u DATE
,而应使用
CURRENT\u TIMESTAMP