当前位置: 首页 > news >正文

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

文章目录

  • 1、常用mysql函数
    • 1.1、对日期标准处理
    • 1.2、日期的加减
    • 1.3、日期标准化输出
    • 1.4、字符串
    • 1.5、通过日计算周几
    • 1.6、通过天计算该年的第几周
  • 2、根据固定字符串格式计算出上期、同期相同格式的时间
    • 2.1题目一
      • 上期求取
      • 同期求取
  • 其他
    • 闰年规则
    • 周探讨(其一)
    • 周探讨(其二)
    • 周探讨(其三)

1、常用mysql函数

1.1、对日期标准处理

STR_TO_DATE('20240720','%Y%m%d')

1.2、日期的加减

  • 负数就是减
  • DAY(日)、MONTH(月)、YEAR(年)
  • 能识别 “20240720”、“2024-07-20”,两种日期字符串
    DATE_ADD('20240720', INTERVAL 1 DAY) as a;
    

1.3、日期标准化输出

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

1.4、字符串

  • 截取年
    #得到2024
    SELECT SUBSTR('20240615',1,4) as a
    

1.5、通过日计算周几

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

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

  • mysql中week()函数的用法
  • WEEK() 函数是 MySQL 中的一个日期和时间函数,它用来计算一个给定日期是一年中的第几周。WEEK() 函数有两种模式,可以通过第二个可选参数来指定:
    #模式 0(默认):一年中的第一周是包含一年中第一个星期日的那一周。
    #模式 1:一年中的第一周是包含一年中第一个星期一的那一周。
    SELECT WEEK('20240615',0)
    

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

2.1题目一

  • 时间格式总览
    日20240615:表示2024年6月15日
    周202401:表示2024年第一周
    月202406:表示2024年6月
    年2024:表示2024年
    
  • 同期都是年维度
    日20240615同期时间为:20230615
    周202401同期时间为:202301
    
  • 周计算规则
    周一为一周的开始
    每年的第一天必定为第一周:如果不是周一,则往前推到上一年的周一拼凑成一周
    每年的最后一天:一定是这年的最后一周
    假设每年的第一天不是周一:每年的最后一周和第二年的第一周其实是相同的时间
    

上期求取

  • #结果20240719
    SELECT DATE_FORMAT(DATE_ADD('20240720', INTERVAL -1 DAY), '%Y%m%d') as a;
    
  • #结果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
    
  • #结果202406,如果传入202401,结果则为202312
    SELECT if(SUBSTR('202407',5)='01',CONCAT(SUBSTR('202407',1,4)-1,'12'),'202407'-1)
    
  • #结果2023
    SELECT '2024'-1 as a;
    

同期求取

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

其他

闰年规则

普通闰年:如果一个年份能够被4整除,但不能被100整除,则它是闰年。
世纪闰年:如果一个年份能够被400整除,则它也是闰年,即使它可以被100整除。
(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周,去年最后一周和今年的第一周重叠了
  • 计算今年第一周的上期的公式为

    #结果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
    
  • 第二个公式(这个是凑巧和其三完全相同了)

    #结果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周
  • 计算今年第一周的上期的公式为

    #结果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周
  • 计算今年第一周的上期的公式为

    #结果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)
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【QT】使用QOpenGLWidget后,窗口全屏之后右键菜单出不来的问题
  • 软件测试面试少走弯路
  • burp suite professional 产品介绍
  • 程序员转行方向推荐
  • 99AutoML 自动化机器学习实践--NNI 自动化机器学习工具包
  • Rider使用习惯
  • 【C++】——string类的模拟实现
  • OpenAI o1 Review 大模型PHD水平数理推理能力 OpenAI o1 vs GPT4o vs Gemini vs Claude
  • SVN的使用技巧
  • 《黑神话:悟空》怎么备份游戏存档?
  • 【C++】认识C++(前言)
  • 顶级高效的ChatGPT论文润色提示词和使用技巧
  • AndroidStudio清除重置Http Proxy代理的方式
  • golang中string底层数据结构与上层数据结构的关系
  • Unite Shanghai 2024 技术专场 | Unity 6及未来规划:Unity引擎和服务路线图
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • ➹使用webpack配置多页面应用(MPA)
  • Cumulo 的 ClojureScript 模块已经成型
  • happypack两次报错的问题
  • isset在php5.6-和php7.0+的一些差异
  • Java IO学习笔记一
  • JavaScript对象详解
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux后台研发超实用命令总结
  • nginx 负载服务器优化
  • python 装饰器(一)
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue.js-Day01
  • 诡异!React stopPropagation失灵
  • 码农张的Bug人生 - 初来乍到
  • 你不可错过的前端面试题(一)
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 手机端车牌号码键盘的vue组件
  • 通过git安装npm私有模块
  • 我有几个粽子,和一个故事
  • 用Canvas画一棵二叉树
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​渐进式Web应用PWA的未来
  • ​如何防止网络攻击?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (笔记)M1使用hombrew安装qemu
  • (独孤九剑)--文件系统
  • (多级缓存)缓存同步
  • (推荐)叮当——中文语音对话机器人
  • (原创)可支持最大高度的NestedScrollView
  • (转载)Linux网络编程入门
  • .cn根服务器被攻击之后
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 后台导出excel ,word
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • :如何用SQL脚本保存存储过程返回的结果集
  • @angular/cli项目构建--http(2)