描述

最近在刷mysql的题目,遇到指定日期是当年第几周的问题。

解决

在这里插入图片描述

0、总结

先总结,具体使用和区别看下文:

# 一、返回第几周
select date_format('2023-01-01','%v') # 返回52,字符样式是小写,星期一是一周的第一天,
									  # 2023年的新的星期还没开始,
									  # 返回了2022年的第52周,实际上是2023年的第0周
select date_format('2023-01-01','%V') # 返回01,大写,星期天是一周的第一天
select week('2023-01-01', 0) # 返回1,这里week函数的第二个参数[0,1,2]的区别在下文提到
select week('2023-01-01', 1) # 返回0
select week('2023-01-01', 2) # 返回1
# 二、返回一周开始和结束
# 1、星期日为一周的开始
select 
	date(now()) as date, 
	date(subdate(now(), date_format(now(), '%w'))) as weekStart,
	date(subdate(now(), (date_format(now(), '%w')-6))) as weekEnd;

# 2、星期一为一周的开始
select 
	date(now()) as date,
	date(subdate(now(), (date_format(now(), '%w')+6)%7)) as weekStart,
	date(subdate(now(),  (date_format(now(), '%w')-7)%7)) as weekEnd

1、返回第几周

方法1:使用date_format函数
select date_format('2023-01-01','%v') #返回52,小写,星期一是一周的第一天,2023年的新的星期还没开始,返回了2022年的第52周,实际上是2023年的第0周
select date_format('2023-01-01','%V') #返回01,大写,星期天是一周的第一天

第二个参数的字符样式
凡是与周有关的样式
小写的为星期一是一周的第一天;大写的都为星期日是一周的第一天;(记忆:西方人基督教有礼拜日,耶稣为大(大写))

在这里插入图片描述

方法2:使用week函数
select week('2023-01-01', 0) # 返回1
select week('2023-01-01', 1) # 返回0
select week('2023-01-01', 2) # 返回1

代码运行结果:
在这里插入图片描述

week()函数使用:

week(符合时间格式的要求的日期或字符串,模式[0,1,2])
当模式为0时,对照模式表可以得知其计算逻辑是:把星期日当做一周的第一天,且第一周是以2023年的第一个星期日开始的,且在2023年的第一个星期日前那些属于2023年的天数都归为第0周。而2023年1月1日刚好是2023年第一个星期日,所以返回的结果是1。

当模式为1时,对照模式表可以得知其计算逻辑是:把星期一当做一周的第一天,且1月1日到本年第一个周一的天数超过3天,则认定这几天处于本年的第1周,若天数没超过3天(不足4天),则认定这几天处于本年的第0周。而2023年1月1日到第一个周一(2023年1月2日)只有1天。所以认定2023年1月1日属于2023年的第0周,所以返回的结果为0。

当模式为2时,对照模式表可以得知其计算逻辑是:把星期日当做一周的第一天,且第一周是以该年的第一个星期日开始的,前面的日期都算作上年度的最后一周(而模式0则是把这几天算作为第0周)。这里以2021年为例,2021年1月2日是2021年第一个星期日之前日期,所以认定这几天属于2020年的最后一周(2020年的第52周),所以select week('2021-01-02',3)返回的结果为52。

2、指定日期所在周的开始和结束日期

参考:mysql小知识:根据指定日期,获取是当年第几周,但是当指定日期为星期天时有bug,稍加修改符合要求

# 星期日为一周的开始
select 
	date(now()) as date, 
	date(subdate(now(), date_format(now(), '%w'))) as weekStart,
	date(subdate(now(), (date_format(now(), '%w')-6))) as weekEnd;

# 星期一为一周的开始
select 
	date(now()) as date,
	date(subdate(now(), (date_format(now(), '%w')+6)%7)) as weekStart,
	date(subdate(now(),  (date_format(now(), '%w')-7)%7)) as weekEnd

subdate函数用法:
  subdate(当前日期指定天数),日期的减法,返回当前日期-指定天数的日期,
  如select subdate('2022-06-26',3)返回的是2022-06-23,因为2022-06-26-3=2022-06-23

结果示例:
星期日为一周的开始
在这里插入图片描述

星期一为一周的开始
在这里插入图片描述
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐