mysql的weekday()返回0=周一、6=周日,sql server的datepart(weekday,getdate())默认1=周日、7=周六,postgresql用extract(dow from now())返回0=周日、6=周六,sqlite用strftime('%w','now')同样0=周日,跨库时需统一转换或下沉至应用层处理。

MySQL 用 WEEKDAY(),SQL Server 用 DATEPART(),两者默认周起始日不同,直接套用会返回错误的“周几”数值。
MySQL 中用 WEEKDAY() 获取星期几(0=周一,6=周日)
WEEKDAY() 返回整数,0 表示周一,6 表示周日 —— 这是 MySQL 默认行为,和日常说的“周日是第7天”不一致。
- 想得到“周日=0,周一=1…周六=6”,该用
DAYOFWEEK()(注意不是WEEKDAY()) -
SELECT WEEKDAY(CURDATE());返回1表示今天是周二 - 如果业务要求前端显示中文(如“周二”),建议在应用层映射,避免在 SQL 里写
CASE WHEN长列表 - 注意:
WEEKDAY(NOW())和WEEKDAY(CURDATE())结果一样,因为只取日期部分
SQL Server 中用 DATEPART() 获取星期几(默认 1=周日,7=周六)
DATEPART(weekday, GETDATE()) 的结果取决于数据库的 DATEFIRST 设置,默认为 7(即周日为第一天),所以返回值是 1(周日)到 7(周六)。
- 执行
SET DATEFIRST 1;后,DATEPART(weekday, GETDATE())才会返回1=周一到7=周日 - 更稳妥的方式是显式指定:
DATEPART(weekday, GETDATE()) + @@DATEFIRST - 1) % 7 + 1(太绕,不推荐) - 实际开发中,多数人直接用
DATENAME(weekday, GETDATE())拿英文名(如'Monday'),再由程序转中文 - 别依赖系统默认
DATEFIRST,尤其跨库迁移时容易出错
PostgreSQL 和 SQLite 怎么办?没有 WEEKDAY 或 DATEPART
PostgreSQL 用 EXTRACT(DOW FROM NOW()),返回 0=周日 到 6=周六;SQLite 用 strftime('%w', 'now'),也是 0=周日。
- 这两个都和 MySQL 的
WEEKDAY()不兼容(MySQL 是周一为 0) - 如果写跨数据库兼容 SQL,别硬套函数名,统一用表达式转换:比如都转成“周一=1,周日=7”,可写
(EXTRACT(DOW FROM NOW()) + 6) % 7 + 1(PostgreSQL) - SQLite 的
%w不能直接参与算术,得先CAST(strftime('%w', 'now') AS INTEGER) - 真正需要跨库时,日期逻辑尽量下沉到应用层,SQL 只负责传原始日期
最易被忽略的是:不同数据库对“一周开始日”的隐式定义不统一,且无法通过函数名直观判断。哪怕只是临时查一条数据,也建议先 SELECT 一个已知星期几的日期验证返回值,而不是凭印象写 WHERE WEEKDAY(x) = 2。










