当我连接到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 ...
我也会看一看方言。非常感谢您的帮助!
答案 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年前的语言对其进行编码。