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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:23:17