You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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关键字,并非字符串常量,不能用单引号包裹。

你可以使用以下两种正确写法之一:

  1. 逗号分隔参数格式:
SELECT
    "Item",
    DATEDIFF(DAY, CURRENT_DATE, "Expiry") AS "Days Remaining"
FROM "Expirations"
  1. FROM ... TO ...格式:
SELECT
    "Item",
    DATEDIFF(DAY FROM CURRENT_DATE TO "Expiry") AS "Days Remaining"
FROM "Expirations"

两种写法都能正确计算当前日期与Expiry日期的天数差,注意时间单位DAY直接书写即可,无需添加任何引号。

内容的提问来源于stack exchange,提问作者hiigaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:35:27