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
相关产品推荐
相关产品推荐

