MySQL获取指定日期为所在月份的第几周

目录

直接查看结果


最近做项目遇到一个看起来很简单的需求——按周统计一个月内的关卡延期次数,这里我需要得到一个日期是它所在月份的周次,如今天'2022-05-27'是本月的第5周。

本来我觉得很简单,但是写起来确实有些许复杂,这里记录一下我写它的思路。

如果有方便的写法,请大佬指出,这个写法确实挺让我头疼的!!

我们先定义一个日期变量@date:

SET @date='2022-05-27';

我们知道DAY()函数可以返回一个日期是当月的第几天,如'2022-05-27'返回的结果是27:

SELECT DAY(@date);

然后我们就可以获取到这个月的第一天,就是@date减去(它的day-1),这个工作可以交给DATE_SUB()函数完成:

SELECT DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY);

我们可以使用WEEKDAY()函数来获取x月1日的星期数,周一返回0、周二返回1....

 则如果x月1日是周一我们不需要操作,如果x月1日不是周一,我们需要对x月1日增加(1-WEEKDAY(x月1日))天,这个判断我们可以使用mysql的IF()函数完成。

IF()函数有三个参数,第一个参数是表达式是一个布尔值,当第一个参数为true时返回第二个参数值,当第一个参数为false时返回第三个参数值。需要注意的是,mysql跟c语言相同,可以使用数值类型表示布尔值,数值0表示false,非0值表示true,于是我们可以获取到x月的第一个周一:

SELECT DATE_ADD(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY),
				INTERVAL IF(WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),
							7-WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),
										0) 
				DAY);

获取到第一个周一以后的事情就方便了,FLOOR((输入的日期-第一个周一的日期)/7)就可以知道距离第一周有几周

SELECT FLOOR(DATEDIFF(@DATE,
                      DATE_ADD(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY),
					    INTERVAL IF(WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),
								7-WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),
								0)
                      DAY)
              )/7);

当x月1日是周一时需要对这个周数加1,当x月1日不是周一时需要对这个周数加2

得到最终结果代码

SELECT FLOOR(DATEDIFF(@DATE,DATE_ADD(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY),
						            INTERVAL IF(WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),
            						7-WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),
									0) DAY
                            )
			  )/7
		)+IF(WEEKDAY(DATE_SUB(@date,INTERVAL (DAY(@date)-1) DAY)),2,1);

 运行无误

可恶啊!博客写着写着发现我之前的sql语句有问题,改代码去了,555555~

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值