Firebird迁移后DATEDIFF函数报错:Token unknown - 'DAY'问题排查
问题描述
原本基于HSQLDB编写的查询语句如下:
SELECT "Item", DATEDIFF('DAY', CURRENT_DATE, "Expiry") AS "Days Remaining" FROM "Expirations"
其中Expiry列的日期格式为YY-MM-DD。将数据库迁移至LibreOffice Base的Firebird后,执行该查询出现以下错误:
firebird_sdbc error:
*Dynamic SQL Error
*SQL error code = -104
*Token unknown - line 1, column 26
*'DAY'
caused by
'isc_dsql_prepare'
at ./connectivity/source/drivers/firebird/Util.cxx:69
查阅Firebird文档,其DATEDIFF语法定义为:
DATEDIFF (<args>) <args> ::= <unit> FROM <moment1> TO <moment2> | <unit>, <moment1>, <moment2> <unit> ::= YEAR | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND | MILLISECOND <momentN> ::= a DATE, TIME or TIMESTAMP expression
尝试直接使用DAY报错后,改用带单引号的'DAY',仍提示'DAY'未知。已知Expiry为日期类型,CURRENT_DATE也属于日期类型,请问问题出在哪里?
解决方案
核心问题是你给DAY添加了单引号——Firebird中DATEDIFF的时间单位是SQL关键字,并非字符串常量,不能用单引号包裹。
你可以使用以下两种正确写法之一:
- 逗号分隔参数格式:
SELECT "Item", DATEDIFF(DAY, CURRENT_DATE, "Expiry") AS "Days Remaining" FROM "Expirations"
FROM ... TO ...格式:
SELECT "Item", DATEDIFF(DAY FROM CURRENT_DATE TO "Expiry") AS "Days Remaining" FROM "Expirations"
两种写法都能正确计算当前日期与Expiry日期的天数差,注意时间单位DAY直接书写即可,无需添加任何引号。
内容的提问来源于stack exchange,提问作者hiigaran
相关产品推荐
相关产品推荐

