MySQL中WEEK(FROM_UNIXTIME(1525212000))结果不符问题咨询
问题原因:WEEK函数的模式差异,不是Bug!
这不是MySQL的Bug,而是WEEK()函数的模式参数规则和你用的在线工具不一致导致的,我给你理清楚来龙去脉:
首先,先确认时间戳对应的日期:FROM_UNIXTIME(1525212000) 输出的是 2018-05-02(周三),这个是准确的。
核心差异:WEEK函数的模式参数
MySQL的WEEK()函数其实支持第二个可选参数mode,它决定了两个关键规则:
- 一周的起始日(周日/周一)
- 第一周的判定标准
不同工具默认的mode不一样,这就是结果差异的根源:
- 你的MySQL默认用的是
mode=0:- 一周从周日开始
- 第一周被定义为「包含当年第一个周日的周」
- 2018年第一个周日是1月7日,所以1月1日-1月6日属于第0周,从1月7日才开始算第1周。这么算下来,5月2日就落在第17周,和你得到的结果一致。
- 在线工具通常用ISO周规则(对应MySQL的
mode=3):- 一周从周一开始
- 第一周被定义为「当年至少包含4天的周」(2018年1月1日是周一,所以1月1日-1月7日直接就是第1周)
- 按照这个规则,5月2日就是第18周,和在线工具的结果匹配。
解决方法
如果你想得到和在线工具一致的结果,只需要显式指定mode=3即可:
SELECT WEEK(FROM_UNIXTIME(1525212000), 3);
执行这个语句会返回18,和在线工具的结果完全一致。
如果希望全局默认使用ISO周规则,可以修改MySQL的系统变量(需要管理员权限):
SET GLOBAL default_week_format = 3;
如果要永久生效,记得修改my.cnf(或my.ini)配置文件,添加一行:
default_week_format = 3
然后重启MySQL服务即可。
内容的提问来源于stack exchange,提问作者Farid Movsumov
相关产品推荐
相关产品推荐

