如何在SQL中筛选近30天内非周末的数据?
嘿,这个需求挺常见的,其实只要在WHERE子句里加个判断日期星期几的条件,就能轻松过滤掉周末啦。不同数据库的函数有点不一样,我给你整理了几种主流数据库的实现方法:
MySQL/MariaDB 实现
你可以用WEEKDAY()或者DAYOFWEEK()函数来判断星期几:
WEEKDAY(DATES)返回值:0=周一,1=周二...5=周六,6=周日,所以过滤掉5和6就行DAYOFWEEK(DATES)返回值:1=周日,2=周一...6=周五,7=周六,所以过滤1和7
修改后的WHERE子句:
WHERE DATES >= DATEADD(DAY, -30, current_timestamp) AND DATES < CURDATE() AND WEEKDAY(DATES) NOT IN (5, 6)
SQL Server 实现
用DATEPART()函数获取星期几,注意dw参数的返回值会受DATEFIRST设置影响(默认周日为第一天)。如果想兼容不同设置,推荐明确指定要保留的工作日:
WHERE DATES >= DATEADD(DAY, -30, GETDATE()) AND DATES < CAST(GETDATE() AS DATE) AND DATEPART(weekday, DATES) IN (2, 3, 4, 5, 6) -- 周一到周五
如果你的数据库设置是周一为第一天(SET DATEFIRST 1),那可以直接过滤掉周六周日:
AND DATEPART(weekday, DATES) NOT IN (6, 7)
PostgreSQL 实现
用EXTRACT(DOW FROM DATES)来获取星期几,DOW的返回值是0=周日,1=周一...6=周六,所以过滤0和6:
WHERE DATES >= CURRENT_TIMESTAMP - INTERVAL '30 days' AND DATES < CURRENT_DATE AND EXTRACT(DOW FROM DATES) NOT IN (0, 6)
或者用TO_CHAR()函数判断英文缩写,注意指定语言避免本地化问题:
AND TO_CHAR(DATES, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN')
Oracle 实现
用TO_CHAR(DATES, 'D')获取星期几,默认1=周日,7=周六,所以过滤1和7:
WHERE DATES >= SYSDATE - 30 AND DATES < TRUNC(SYSDATE) AND TO_CHAR(DATES, 'D') NOT IN ('1', '7')
同样,为了避免语言影响,也可以指定英文缩写:
AND TO_CHAR(DATES, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN')
要是你用的是其他小众数据库,可以告诉我,我再给你调整对应的写法~
内容的提问来源于stack exchange,提问作者Jonathan Livingston Seagull
相关产品推荐
相关产品推荐

