mysql对于上期同期的时间的处理

文章目录

1、常用mysql函数

1.1、对日期标准处理

sql 复制代码
STR_TO_DATE('20240720','%Y%m%d')

1.2、日期的加减

  • 负数就是减

  • DAY(日)、MONTH(月)、YEAR(年)

  • 能识别 "20240720"、"2024-07-20",两种日期字符串

    sql 复制代码
    DATE_ADD('20240720', INTERVAL 1 DAY) as a;

1.3、日期标准化输出

sql 复制代码
#变成20240801
SELECT DATE_FORMAT('2024-08-01', '%Y%m%d') as a;
#获取年2024
SELECT DATE_FORMAT('2024-05-01','%Y') as a;

1.4、字符串

  • 截取年

    sql 复制代码
    #得到2024
    SELECT SUBSTR('20240615',1,4) as a

1.5、通过日计算周几

  • DAYOFWEEK() 函数会返回一个介于 1 到 7 之间的整数,其中 1 表示星期日,2 表示星期一,依此类推,直到 7 表示星期六

    sql 复制代码
    SELECT DAYOFWEEK('20240615')

1.6、通过天计算该年的第几周

  • mysql中week()函数的用法

  • WEEK() 函数是 MySQL 中的一个日期和时间函数,它用来计算一个给定日期是一年中的第几周。WEEK() 函数有两种模式,可以通过第二个可选参数来指定:

    sql 复制代码
    #模式 0(默认):一年中的第一周是包含一年中第一个星期日的那一周。
    #模式 1:一年中的第一周是包含一年中第一个星期一的那一周。
    SELECT WEEK('20240615',0)

2、根据固定字符串格式计算出上期、同期相同格式的时间

2.1题目一

  • 时间格式总览

    txt 复制代码
    日20240615:表示2024年6月15日
    周202401:表示2024年第一周
    月202406:表示2024年6月
    年2024:表示2024年
  • 同期都是年维度

    复制代码
    日20240615同期时间为:20230615
    周202401同期时间为:202301
  • 周计算规则

    txt 复制代码
    周一为一周的开始
    每年的第一天必定为第一周:如果不是周一,则往前推到上一年的周一拼凑成一周
    每年的最后一天:一定是这年的最后一周
    假设每年的第一天不是周一:每年的最后一周和第二年的第一周其实是相同的时间

上期求取

  • sql 复制代码
    #结果20240719
    SELECT DATE_FORMAT(DATE_ADD('20240720', INTERVAL -1 DAY), '%Y%m%d') as a;
  • sql 复制代码
    #结果202406
    #对每年的第一周的上期计算方式:逻辑为判定上年的第一天是否为周日,如果是周日则为53周,如果为周六又同时是闰年则为53周,其余情况都是52周。具体解释看周探讨(其一)的详细解释
    SELECT
    IF
    	(
    		SUBSTR( '202407', 5 )= '01',
    	IF
    		(
    			DAYOFWEEK(
    			CONCAT( SUBSTR( '202407', 1, 4 )- 1, '0101' ))= 1,
    			CONCAT( SUBSTR( '202407', 1, 4 )- 1, '53' ),
    		IF
    			(
    				DAYOFWEEK(
    				CONCAT( SUBSTR( '202407', 1, 4 )- 1, '0101' ))= 7 
    				AND ((
    						SUBSTR( '202407', 1, 4 )- 1 
    						) % 4 = 0 
    					AND ( SUBSTR( '202407', 1, 4 )- 1 ) % 100 != 0 
    				) 
    				OR ( ( SUBSTR( '202407', 1, 4 )- 1 ) % 400 = 0 ),
    				CONCAT( SUBSTR( '202407', 1, 4 )- 1, '53' ),
    			CONCAT( SUBSTR( '202407', 1, 4 )- 1, '52' ))),
    	'202407' - 1)  as a
  • sql 复制代码
    #结果202406,如果传入202401,结果则为202312
    SELECT if(SUBSTR('202407',5)='01',CONCAT(SUBSTR('202407',1,4)-1,'12'),'202407'-1)
  • sql 复制代码
    #结果2023
    SELECT '2024'-1 as a;

同期求取

  • sql 复制代码
    #结果20230720
    SELECT DATE_FORMAT(DATE_ADD('20240720', INTERVAL -1 YEAR), '%Y%m%d') as a;
  • sql 复制代码
    #结果202327
    SELECT '202427'-100 as a;
  • sql 复制代码
    #结果202305
    SELECT '202405'-100 as a;
  • sql 复制代码
    #结果2023
    SELECT '2024'-1 as a;

其他

闰年规则

txt 复制代码
普通闰年:如果一个年份能够被4整除,但不能被100整除,则它是闰年。
世纪闰年:如果一个年份能够被400整除,则它也是闰年,即使它可以被100整除。
sql 复制代码
(year % 4 = 0 AND year % 100 != 0) OR (year % 400 = 0)

周探讨(其一)

  • 周一为一周的开始

  • 每年的第一天必定为第一周:如果不是周一,则往前推到上一年的周一拼凑成一周

  • 每年的最后一天必定为最后一周:如果不是周日,则向前推到明年的周日拼凑成一周

  • 假设每年的第一天不是周一:去年的最后一周和今年的第一周其实是相同的时间

  • 去年非闰年

    去年的第一天 今年第一周的上期 说明
    周一 52 因为去年最后一天为周一,虽然有53周,但是去年的第53周和今年的第一周是同一周
    周二 52 最后一天为周二
    周三 52 最后一天为周三
    周四 52 最后一天为周四
    周五 52 最后一天为周五
    周六 52 最后一天为周六
    周日 53 去年最后一天为周日,这一年有53周,但是去年最后一周不是今年的第一周
  • 去年闰年

    去年的第一天 今年第一周的上期 说明
    周一 52 去年最后一天为周二,有53周,但是去年最后一周和今年的第一周重叠了
    周二 52 最后一天为周三
    周三 52 最后一天为周四
    周四 52 最后一天为周五
    周五 52 最后一天为周六
    周六 53 周日,有53周,最后一周没有和第一周重叠
    周日 53 周一,有54周,去年最后一周和今年的第一周重叠了
  • 计算今年第一周的上期的公式为

    sql 复制代码
    #结果202353
    #对每年的第一周的上期计算方式:逻辑为判定上年的第一天是否为周日,如果是周日则为53周,如果为周六又同时是闰年则为53周,其余情况都是52周	
    SELECT
    IF
    	(
    		SUBSTR( '202401', 5 )= '01',
    	IF
    		(
    			DAYOFWEEK(
    			CONCAT( SUBSTR( '202401', 1, 4 )- 1, '0101' ))= 1,
    			CONCAT( SUBSTR( '202401', 1, 4 )- 1, '53' ),
    		IF
    			(
    				DAYOFWEEK(
    				CONCAT( SUBSTR( '202401', 1, 4 )- 1, '0101' ))= 7 
    				AND ((
    						SUBSTR( '202401', 1, 4 )- 1 
    						) % 4 = 0 
    					AND ( SUBSTR( '202401', 1, 4 )- 1 ) % 100 != 0 
    				) 
    				OR ( ( SUBSTR( '202401', 1, 4 )- 1 ) % 400 = 0 ),
    				CONCAT( SUBSTR( '202401', 1, 4 )- 1, '53' ),
    			CONCAT( SUBSTR( '202401', 1, 4 )- 1, '52' ))),
    	'202401' - 1)  as a
  • 第二个公式(这个是凑巧和其三完全相同了)

    sql 复制代码
    #结果202353
    #对每年的第一周的上期计算方式:使用WEEK函数取去年最后一天为第几周(函数模式为0,默认模式)	
    SELECT IF(SUBSTR( '202401', 5 )= '01',CONCAT(SUBSTR( '202401', 1, 4 )- 1,WEEK(CONCAT(SUBSTR( '202401', 1, 4 )- 1,'1231'),0)),'202401'-1)

周探讨(其二)

  • 周一为一周的开始

  • 每年的第一天如果不是周一,则为第0周

  • 每年的最后一天必定为最后一周:如果不是周日,则向前推到明年的周日拼凑成一周

  • 假设每年的第一天不是周一:去年的最后一周和今年的第0周其实是相同的时间

  • 因为每年未必有第0周,这里作者直接使用本年的第一周求上期

  • 去年非闰年

    去年的第一天 今年第一周的上期 说明
    周一 53 去年最后一天为周一,所以有53周
    周二 52 第一周为0周,所以只有52周
    周三 52 第一周为0周,所以只有52周
    周四 52 第一周为0周,所以只有52周
    周五 52 第一周为0周,所以只有52周
    周六 52 第一周为0周,所以只有52周
    周日 52 第一周为0周,所以只有52周
  • 去年闰年

    去年的第一天 今年第一周的上期 说明
    周一 53 第一天为周一,最后一天为周二,有53周
    周二 52 第一周为0周,最后一天为周三,所以只有52周
    周三 52 第一周为0周,最后一天为周四,所以只有52周
    周四 52 第一周为0周,最后一天为周五,所以只有52周
    周五 52 第一周为0周,最后一天为周六,所以只有52周
    周六 52 第一周为0周,最后一天为周日,所以只有52周
    周日 53 第一周为0周,最后一天为周一,有53周
  • 计算今年第一周的上期的公式为

    sql 复制代码
    #结果202352
    #对每年的第一周的上期计算方式:使用WEEK函数取去年最后一天为第几周(函数模式为1)	
    SELECT IF(SUBSTR( '202401', 5 )= '01',CONCAT(SUBSTR( '202401', 1, 4 )- 1,WEEK(CONCAT(SUBSTR( '202401', 1, 4 )- 1,'1231'),1)),'202401'-1)

周探讨(其三)

  • 周日为一周的开始

  • 每年的第一天如果不是周日,则为第0周

  • 每年的最后一天必定为最后一周:如果不是周六,则向前推到明年的周六拼凑成一周

  • 假设每年的第一天不是周日:去年的最后一周和今年的第0周其实是相同的时间

  • 因为每年未必有第0周,这里作者直接使用本年的第一周求上期

  • 去年非闰年

    去年的第一天 今年第一周的上期 说明
    周一 52 第一周为0周,所以只有52周
    周二 52 第一周为0周,所以只有52周
    周三 52 第一周为0周,所以只有52周
    周四 52 第一周为0周,所以只有52周
    周五 52 第一周为0周,所以只有52周
    周六 52 第一周为0周,所以只有52周
    周日 53 第一周为1周,去年最后一天为周日,所以有53周
  • 去年闰年

    去年的第一天 今年第一周的上期 说明
    周一 52 第一周为0周,最后一天为周二,所以只有52周
    周二 52 第一周为0周,最后一天为周三,所以只有52周
    周三 52 第一周为0周,最后一天为周四,所以只有52周
    周四 52 第一周为0周,最后一天为周五,所以只有52周
    周五 52 第一周为0周,最后一天为周六,所以只有52周
    周六 53 第一周为0周,最后一天为周日,所以有53周
    周日 53 第一周为1周,最后一天为周一,所以有53周
  • 计算今年第一周的上期的公式为

    sql 复制代码
    #结果202353
    #对每年的第一周的上期计算方式:使用WEEK函数取去年最后一天为第几周(函数模式为0,默认模式)	
    SELECT IF(SUBSTR( '202401', 5 )= '01',CONCAT(SUBSTR( '202401', 1, 4 )- 1,WEEK(CONCAT(SUBSTR( '202401', 1, 4 )- 1,'1231'),0)),'202401'-1)
相关推荐
Doro再努力11 分钟前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华27 分钟前
echarts使用案例
android·javascript·echarts
WangYaolove13141 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
做人不要太理性1 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
山岚的运维笔记2 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
我命由我123452 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟2 小时前
Tauri2 导出 Android 详细教程
android
roman_日积跬步-终至千里3 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科3 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
lpruoyu3 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习