PostgreSQL按月统计工作日周末数量 解决WEEKDAY函数不存在报错
问题解答
1. 关于WEEKDAY函数的疑问
PostgreSQL 没有内置的 WEEKDAY 函数,这个函数是 MySQL 专属的语法,因此会触发函数不存在的报错。
2. 替代实现方案
MySQL的WEEKDAY函数规则为:周一返回0、周二返回1……周五返回4、周六返回5、周日返回6。在PostgreSQL中可以用EXTRACT(ISODOW FROM 日期)实现等价逻辑,该语法的规则为:周一返回1、周二返回2……周五返回5、周六返回6、周日返回7,仅需要简单调整判断条件即可匹配原有逻辑。
此外你用到的MONTH()函数同样是MySQL专属语法,PostgreSQL中需要用EXTRACT(MONTH FROM 日期)替代,IF()函数可以用标准SQL的CASE WHEN或者PostgreSQL专属的FILTER语法实现。
改写后的通用兼容查询语句
SELECT fname, EXTRACT(MONTH FROM eventDate) AS event_month, SUM(CASE WHEN EXTRACT(ISODOW FROM eventDate) < 6 THEN 1 ELSE 0 END) AS WeekdayCount, SUM(CASE WHEN EXTRACT(ISODOW FROM eventDate) >= 6 THEN 1 ELSE 0 END) AS WeekendCount FROM eventcal AS e LEFT JOIN users AS u ON e.primary = u.username GROUP BY fname, EXTRACT(MONTH FROM eventDate);
更简洁的PostgreSQL专属写法(使用FILTER语法)
SELECT fname, EXTRACT(MONTH FROM eventDate) AS event_month, COUNT(*) FILTER (WHERE EXTRACT(ISODOW FROM eventDate) < 6) AS WeekdayCount, COUNT(*) FILTER (WHERE EXTRACT(ISODOW FROM eventDate) >= 6) AS WeekendCount FROM eventcal AS e LEFT JOIN users AS u ON e.primary = u.username GROUP BY fname, EXTRACT(MONTH FROM eventDate);
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

