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

Firebird数据库中计算过去28天工作时长的SQL问题

解决方案

1. 语法错误原因及修正

你遇到的Token unknown - *,错误是因为Firebird的DATEADD函数参数顺序不正确。Firebird中DATEADD的正确语法是:

DATEADD(<间隔单位>, <偏移值>, <基准时间戳>)

你原语句中将偏移值-672放在了间隔单位HOUR之前,导致语法解析失败。

2. 日期时间列合并问题处理

由于表中日期和时间是分开存储的,直接用Start和End计算时长会忽略日期信息(比如跨天工作的情况),必须先将Date与Start/End合并为完整的时间戳:

  • 将DATE类型的Date转为TIMESTAMP(默认时间为当天00:00:00)
  • 将TIME类型的Start/End转为INTERVAL(表示小时分秒的间隔)
  • 两者相加得到完整的开始/结束时间戳

3. 最终正确SQL语句

以下语句既修正了语法错误,又处理了日期时间合并的问题,同时准确筛选过去28天的记录:

SELECT SUM(DATEDIFF(HOUR, 
                    CAST("Date" AS TIMESTAMP) + CAST("Start" AS INTERVAL), 
                    CAST("Date" AS TIMESTAMP) + CAST("End" AS INTERVAL))) AS total_work_hours
FROM "Duty"
WHERE CAST("Date" AS TIMESTAMP) + CAST("Start" AS INTERVAL) > DATEADD(HOUR, -672, CURRENT_TIMESTAMP)

可选优化(适用于无跨天工作场景)

如果你的所有工作都在Date当天完成(即End不会晚于次日00:00),可以简化WHERE条件,直接用日期筛选:

SELECT SUM(DATEDIFF(HOUR, CAST("Start" AS INTERVAL), CAST("End" AS INTERVAL))) AS total_work_hours
FROM "Duty"
WHERE "Date" >= DATEADD(DAY, -28, CURRENT_DATE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:01:19