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)
相关推荐
阿巴斯甜7 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker7 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95278 小时前
Andorid Google 登录接入文档
android
黄林晴9 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android