如何在Firebird SQL中统计两个日期间的每周订单总数
Firebird SQL 每周订单统计及DATEDIFF报错解决
一、DATEDIFF周数计算错误修复
Firebird的DATEDIFF函数不支持ww作为周单位,正确的周单位是week(或缩写w),同时Firebird查询必须包含FROM子句(可使用系统表RDB$DATABASE)。修正后的语句:
SELECT DATEDIFF(week, DATE '2019-09-18', DATE '2019-12-01') AS 周数差 FROM RDB$DATABASE;
二、统计两个日期间每周订单总数
你原语句的问题在于GROUP BY使用了固定日期偏移,未关联每个订单的实际日期,且不能直接用SELECT中的别名分组。正确做法是将每个订单日期映射到其所在周的第一天,再按该日期分组统计。
以周一作为每周第一天(Firebird默认周日为一周起始,需调整偏移)
SELECT COUNT(*) AS 每周订单总数, DATEADD(DAY, -EXTRACT(WEEKDAY FROM r.TARIH) + 1, r.TARIH) AS 每周第一天 FROM RB r WHERE r.TARIH BETWEEN DATE '2019-09-18' AND DATE '2019-12-01' GROUP BY DATEADD(DAY, -EXTRACT(WEEKDAY FROM r.TARIH) + 1, r.TARIH) ORDER BY 每周第一天;
以周日作为每周第一天
SELECT COUNT(*) AS 每周订单总数, DATEADD(DAY, -EXTRACT(WEEKDAY FROM r.TARIH), r.TARIH) AS 每周第一天 FROM RB r WHERE r.TARIH BETWEEN DATE '2019-09-18' AND DATE '2019-12-01' GROUP BY DATEADD(DAY, -EXTRACT(WEEKDAY FROM r.TARIH), r.TARIH) ORDER BY 每周第一天;
关键说明
EXTRACT(WEEKDAY FROM 日期)返回值:周日=0,周一=1,周六=6,以此为基础通过DATEADD偏移得到周第一天- Firebird不支持在
GROUP BY中直接引用SELECT的别名,需重复写入日期计算表达式(或用子查询封装)
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

