如何从SQL获取星期几信息_使用DAYNAME函数解析
DAYNAME()在MySQL中返回固定英文星期名,不支持数字或中文;PostgreSQL需用TO_CHAR(col,'FMDay'),SQLite须用strftime()配合CASE映射,跨库应统一用数字函数如WEEKDAY()/EXTRACT(DOW FROM ...)/strftime('%w',...)。MySQL 中 DAYNAME() 返回的是英文星期名,不是数字很多人用 DAYNAME() 是想判断“今天是不是周日”,结果发现返回 'Monday' 这种字符串,没法直接和数字 0–6 比较。它只做一件事:把日期转成本地化(但实际是固定英文)的星期名称,不支持格式控制,也不受 lc_time_names 影响(除非你显式设了,且 MySQL 版本 ≥ 5.7.14)。常见错误现象:WHERE DAYNAME(date_col) = 0 直接报错或永远不匹配;或者误以为 DAYNAME('2024-01-01') 会返回 '周一',其实固定返回 'Monday'。如果要数字(比如周一=1,周日=7),改用 WEEKDAY()(周一=0)或 DAYOFWEEK()(周日=1)DAYNAME() 的参数必须是合法日期类型,传入 NULL 或非法字符串(如 '2024-13-01')会返回 NULL,不报错但容易漏数据在 WHERE 条件里用 DAYNAME(col) = 'Sunday' 可以,但性能差——无法走索引,建议提前计算好并存为冗余字段或用生成列PostgreSQL 没有 DAYNAME(),得用 TO_CHAR()直接写 DAYNAME(date_col) 在 PostgreSQL 里会报错:ERROR: function dayname(timestamp without time zone) does not exist。它不用函数名映射,而是靠格式化模板。正确做法是用 TO_CHAR(date_col, 'Day')(注意首字母大写,带空格补位)或更干净的 TO_CHAR(date_col, 'FMDay')(FM 去掉尾部空格)。TO_CHAR(col, 'D') 返回数字(周日=1),但受 lc_time 和 datestyle 影响,行为不稳定,别依赖想跨数据库兼容?别硬套函数名,统一用 EXTRACT(DOW FROM col)(PostgreSQL)对应 MySQL 的 DAYOFWEEK(col)-1,都是周日=0、周六=6如果输出要中文,PostgreSQL 需配合 lc_time 设置为 'zh_CN.UTF-8',且 TO_CHAR(col, 'FMDay') 才显示 '星期一';否则仍是英文SQLite 里根本没 DAYNAME(),得手拼或用 strftime()SQLite 不提供 DAYNAME(),调用就报 no such function: DAYNAME。它的日期函数全靠 strftime() 模板驱动。 Murf AI AI文本转语音生成工具
