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)
相关推荐
火柴就是我12 分钟前
首次使用Android Studio时,http proxy,gradle问题解决
android
柏油21 分钟前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
limingade24 分钟前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下39 分钟前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
DolphinScheduler社区1 小时前
白鲸开源WhaleStudio与崖山数据库管理系统YashanDB完成产品兼容互认证
数据库·开源·认证·崖山数据库·白鲸开源
阑梦清川1 小时前
AI超级智能体项目教程(二)---后端项目初始化(设计knif4j接口文档的使用)
java·前端·数据库
hotlinhao1 小时前
ThinkPHP6模型中多组条件逻辑或Or查询的使用
linux·服务器·数据库
jack xu11 小时前
高频面试题:如何保证数据库和es数据一致性
java·大数据·数据库·mysql·elasticsearch
Pocker_Spades_A1 小时前
金仓数据库征文-政务领域国产化数据库更替:金仓 KingbaseES 应用实践
数据库·政务·金仓数据库 2025 征文·数据库平替用金仓
XY.散人2 小时前
初识Redis · 哨兵机制
数据库·redis·缓存