目录

直接查看结果


最近做项目遇到一个看起来很简单的需求——按周统计一个月内的关卡延期次数,这里我需要得到一个日期是它所在月份的周次,如今天'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~

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

  1. java获取指定日期的所在周的第一天(周一)

    java获取指定日期的所在周的第一天(周一) private static void getWeekByDate(Date time) {SimpleDateFormat sdf = new Simp ...

  2. SQLSERVER 查询指定日期是对应月份的第几周

    一.使用场景:统计每个月份对应各周(第一周从1号开始计算,最后一周按照月份最后一天计算)的数据汇总情况: 二.SQL SERVER查询: declare @date datetime set @dat ...

  3. 使用Calendar类获取指定日期所在年/月份、周第一天、最后一天

    最近做项目有涉及需要获取指定日期或当前日期所在月份和周第一和最后一天,结合网上的资料和自己项目开发记录,记录下用到的这些方法. 目录 1.获取指定年份的第一天和最后一天 2. 获取指定日期月份第一天和 ...

  4. php获得每个月第一天的时间,PHP获取指定日期所在月的第一天和最后一天几个例子...

    标题有点说不清楚了就是否PHP获取指定日期所在月的第一天和最后一天几个段程序了了,下文给各位总结一下吧. 示例代码  代码如下 复制代码 //获取指定日期所在月的第一天和最后一天 function G ...

  5. 获取指定日期的月份的第几个星期几是几号

    获取指定日期的月份的第几个星期几是几号 /*** 获取指定日期的月份的第几个星期几是几号* @param date 指定日期* @param ordinal 第几个星期,无限制,但通常在-5到5之间* ...

  6. 获取指定日期所在月的最后一个工作日

    java获取最后一个工作日 如: 2021年02月 最后一个工作日是26号 /*** 通过字符串创建日期* @param dateStr yyyy-MM-dd* @return 日期*/public ...

  7. JAVA实现获取指定日期所在的周的所有日期

    需求:获取指定日期所在的周的所有日期 思路:获取指定日期所在的周的第一天,即周一的日期,设置日历的日期为那一天,依次取七天的日期 实现: package com.day0405;import java ...

  8. 获取指定日期所在周的每一天的日期(周一,周二,周三,周四,周五到周末 )

    最近项目用到,特此记录. public class Test {public static void main(String[] args) {System.out.println(getNeedDa ...

  9. 获取指定日期之间的各个周和月

    2019独角兽企业重金招聘Python工程师标准>>> 日志格式化类 Date.class.php <?php class Datefmt{function __constru ...

最新文章

  1. 搭建远程linux,如何在远程Linux服务器上搭建Nginx?
  2. spring beanFactory
  3. 7-1 抓老鼠啊~亏了还是赚了? (20 分)
  4. linux调试crontab,linux - crontab 的调试,启动thin服务器
  5. 26条安全开车经验 开车20年老司机分享
  6. Juypter 代码自动补全
  7. concat效率 mysql_MySQL统计函数GROUP_CONCAT使用陷阱分析
  8. CNN中的卷积核及TensorFlow中卷积的各种实现
  9. vsflexgrid 最后一行 求和_合并单元格求和、计数、平均值,这个方法很实用
  10. leetcode题解14-最长公共前缀
  11. 吴军信息论40讲_刘润对谈吴军:每个人都一定要有数学思维
  12. Atitit. 解决80端口 System 占用pid 4,,找到拉个程序或者服务占用http 80服务
  13. 单词测试通关学英语的软件,推荐5款最火的英语学习类app
  14. ORACLE11gR2安装XDB
  15. ffmpeg开发打印音视频meta信息
  16. Thread.Sleep vs. Task.Delay
  17. 天天在谈BI,到底什么才是真正的商业智能BI
  18. practice之Python爬取今日头条图片(正则表达式)
  19. 字符串包含单引号加上mybitis${}写法引发的plese exclude tableName or statementId异常
  20. Java技术实验三 货物进销管理系统

热门文章

  1. 解决斜杠符号被转义的问题
  2. (转)《一定要争气》
  3. 隐忍成大事:春秋五霸楚庄王必成雄主之谜
  4. 记录个js调用浏览器打印功能的代码
  5. JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)
  6. 基于single-spa+vue的前端微服务项目实践
  7. 数据可视化之中国足球队在国际足联及亚洲的历史排名看这儿
  8. VirtualBox管理工具Vboxmanage
  9. Chrome浏览器的自带翻译用途
  10. 泰山OFFICE技术讲座:为字体调整字间距的研究,设置值何时生效