当前位置:网站首页>MySQL获取指定日期为所在月份的第几周
MySQL获取指定日期为所在月份的第几周
2022-08-08 06:27:00 【写做四月一日的四月一日】
目录
最近做项目遇到一个看起来很简单的需求——按周统计一个月内的关卡延期次数,这里我需要得到一个日期是它所在月份的周次,如今天'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~
边栏推荐
- 【图形学】05 渲染管线基础
- 关于Unity 按键事件响应错误触发UI事件的问题解决
- Unity学习笔记 01 —— 常用API
- Unity学习笔记 03 —— 三维数学
- Problems when signed and unsigned numbers are involved in operations
- 【图形学】09 UnityShader入门(一)
- 括号问题
- Folder permission configuration for Unity local IIS service construction
- Double week leetcode 84th game
- Unity_条形图(柱状图)+ UI动画
猜你喜欢
随机推荐
文件常用操作 IO流原理及分类
【Unity】unity中对象池的使用
P17 五子棋的实现4 悔棋功能
【图形学】14 UnityShader语义(二)
Writing of Makefile (detailed example)
Unity_圆环滑动条(圆形、弧形滑动条)
【图形学】 06 四元数(一)
[Unity] GPU动画实现(三)——材质合并
HDU 6029 个人分析
Dropout、剪枝、正则化有什么关系?什么是Dropout?
【图形学】11 UnityShader入门(三)
[Unity] GPU动画实现(一)——介绍
计算机网络 | 03.[HTTP篇] HTTP缓存技术
datetime模块,os模块,sys模块,json模块
反射,魔法方法,元类相关知识点总结
Unity_常用数据分析总结:折线图、条形图(柱状图)、扇形图(饼状图)、雷达图(属性图)
通过使用fgets()统计文件的行号和使用fgets()/fputs()拷贝文件
顺序循环队列的创建和基本应用
在ENSP中配置DHCP服务器
Unity学习笔记 03 —— 三维数学