mysql 8.0 日期维度表生成(可运行)

news2024/9/24 7:24:18

mysql 8.0 日期维度表生成(可运行)

文章目录

  • mysql 8.0 日期维度表生成(可运行)
    • 日期维度表左右
    • 日期维度表生成
    • 技术点


日期维度表左右

在数据仓库(Data Warehouse)中,日期维度表(Date Dimension Table)是非常重要的,因为大多数业务数据都涉及时间维度。日期维度表提供了丰富的日期信息,帮助用户进行时间相关的数据分析和报表生成。具体作用包括:

  • 提供标准化的日期信息

日期维度表为每个日期提供了标准化的、多种格式的日期表示,如短日期、中日期、长日期、完整日期等。这些格式可以满足不同的业务需求,使得在数据展示时更加灵活。

  • 支持多种时间粒度的分析

日期维度表提供了丰富的时间粒度信息,例如:

年、月、季度、周等字段,可以方便地进行按年、按月、按季度或按周的分析。
一年中的第几天(day_in_year)、一月中的第几天(day_in_month)、周的第一天或最后一天等字段,支持更细致的时间计算和汇总分析。

  • 支持日期的国际化

通过存储英文和中文等不同语言的日期格式和星期几、月份的名称,日期维度表可以适应国际化需求,支持多语言环境下的数据展示和分析。

  • 支持复杂的时间维度计算

日期维度表预先计算了一些复杂的时间逻辑,如:

周的第一天和最后一天(is_first_day_in_week 和 is_last_day_in_week),方便做周度数据分析。
月份和季度的起止日期(is_first_day_in_month、is_last_day_in_month),帮助识别月度或季度的起止时间。
季度编号和年度季度(quarter_number、year_quarter),可以简化季度分析时的逻辑。

  • 增强查询效率

通过使用日期维度表,数据仓库中的事实表可以使用日期维度表的主键(日期键 date_key)进行关联,从而减少在查询中对时间的复杂计算。例如,避免在每次查询时都使用 DATE_FORMAT 函数转换日期,而是直接关联维度表中的现成字段,提升查询效率。

  • 方便时间序列分析

日期维度表可以帮助快速进行时间序列分析,如趋势分析、环比分析、同比分析等。它为每个日期提供了连续的时间线,方便与事实表关联进行时间序列计算。

  • 支持特殊日的标记

日期维度表还可以扩展,加入一些自定义的特殊日标记,如节假日(元旦、春节等)或其他业务相关的重要日期,这样在分析时可以轻松区分平日和特殊日的业务表现。

  • 作为业务时间轴的基础

日期维度表通常作为其他维度表的基础,比如根据日期维度表中的季度信息生成季度维度表,根据月份生成月份维度表等。它是建立时间相关的业务逻辑的核心。

  • 统一时间标准

通过使用统一的日期维度表,数据仓库中的所有时间相关分析都可以基于同一日期集合,确保一致性。例如,所有按周、月或季度的分析,都可以从同一维度表中获取相关信息,避免由于日期计算的不同而导致的不一致性。

  • 易于维护和扩展

日期维度表通常是自动生成的,维护简单。如果需要扩展新的时间字段(如农历日期或其他时区的日期信息),也可以在日期维度表中直接扩展字段,保持数据仓库的灵活性。


日期维度表生成

创建日期维度表的表结构:

CREATE TABLE `dim_date` (
  `date` date NOT NULL COMMENT '完整日期 (作为主键)',
  `date_short` varchar(10) DEFAULT NULL COMMENT '短日期格式 (YY/MM/DD)',
  `date_medium` varchar(12) DEFAULT NULL COMMENT '中日期格式 (MMM DD, YYYY)',
  `date_long` varchar(20) DEFAULT NULL COMMENT ' 长日期格式 (MMMM DD, YYYY)',
  `date_full` varchar(30) DEFAULT NULL COMMENT ' 完整日期格式 (Weekday, Month DD, YYYY)',
  `day_in_year` int DEFAULT NULL COMMENT ' 一年中的第几天',
  `day_in_month` int DEFAULT NULL COMMENT ' 一月中的第几天',
  `day_name` varchar(10) DEFAULT NULL COMMENT ' 完整的星期几名称 (e.g., Monday)',
  `day_abbreviation` varchar(3) DEFAULT NULL COMMENT ' 星期几缩写 (e.g., Mon)',
  `day_abbreviation_zh` varchar(6) DEFAULT NULL COMMENT ' 星期几缩写 (e.g., 星期一,星期二)',
  `week_in_year` int DEFAULT NULL COMMENT ' 一年中的第几周',
  `week_in_month` int DEFAULT NULL COMMENT ' 一月中的第几周',
  `month_number` int DEFAULT NULL COMMENT ' 月份编号 (1-12)',
  `month_abbreviation` varchar(3) DEFAULT NULL COMMENT ' 月份缩写 (e.g., Jan)',
  `month_abbreviation_zh` varchar(3) DEFAULT NULL COMMENT ' 月份缩写 (e.g., 一月,二月)',
  `year2` varchar(2) DEFAULT NULL COMMENT ' 2位年份 (e.g., 23)',
  `year4` varchar(4) DEFAULT NULL COMMENT ' 4位年份 (e.g., 2023)',
  `quarter_name` varchar(6) DEFAULT NULL COMMENT ' 季度名称 (e.g., Q1)',
  `quarter_name_zh` varchar(6) DEFAULT NULL COMMENT ' 季度名称 (e.g., 第一季度,第二季度)',
  `quarter_number` int DEFAULT NULL COMMENT ' 季度编号 (1-4)',
  `is_first_day_in_week` tinyint(1) DEFAULT NULL COMMENT ' 是否为一周的第一天',
  `is_last_day_in_week` tinyint(1) DEFAULT NULL COMMENT ' 是否为一周的最后一天',
  `is_first_day_in_month` tinyint(1) DEFAULT NULL COMMENT ' 是否为一个月的第一天',
  `is_last_day_in_month` tinyint(1) DEFAULT NULL COMMENT ' 是否为一个月的最后一天',
  `year_quarter` varchar(7) DEFAULT NULL COMMENT ' 年度季度 (e.g., 2023-Q1)',
  `year_month_number` varchar(7) DEFAULT NULL COMMENT ' 年度月份编号 (e.g., 2023-01)',
  `year_month_abbreviation` varchar(8) DEFAULT NULL COMMENT ' 年度月份缩写 (e.g., 2023-Jan)',
  `date_key` int DEFAULT NULL COMMENT ' 日期键 (YYYYMMDD)',
  PRIMARY KEY (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

创建日期维度表存储过程:

CREATE PROCEDURE `fill_dim_date`(IN start_date DATE, IN end_date DATE)

begin
	
  DECLARE current_date1 DATE;
  DECLARE day_name_zh VARCHAR(6);
  DECLARE month_abbreviation_zh VARCHAR(3);
  DECLARE quarter_name_zh VARCHAR(6);

  SET current_date1 = start_date;

  WHILE current_date1 <= end_date DO

    -- 计算中文星期几
    CASE DAYOFWEEK(current_date1)
      WHEN 1 THEN SET day_name_zh = '星期日';
      WHEN 2 THEN SET day_name_zh = '星期一';
      WHEN 3 THEN SET day_name_zh = '星期二';
      WHEN 4 THEN SET day_name_zh = '星期三';
      WHEN 5 THEN SET day_name_zh = '星期四';
      WHEN 6 THEN SET day_name_zh = '星期五';
      WHEN 7 THEN SET day_name_zh = '星期六';
    END CASE;

    -- 计算中文月份缩写
    CASE MONTH(current_date1)
      WHEN 1 THEN SET month_abbreviation_zh = '一月';
      WHEN 2 THEN SET month_abbreviation_zh = '二月';
      WHEN 3 THEN SET month_abbreviation_zh = '三月';
      WHEN 4 THEN SET month_abbreviation_zh = '四月';
      WHEN 5 THEN SET month_abbreviation_zh = '五月';
      WHEN 6 THEN SET month_abbreviation_zh = '六月';
      WHEN 7 THEN SET month_abbreviation_zh = '七月';
      WHEN 8 THEN SET month_abbreviation_zh = '八月';
      WHEN 9 THEN SET month_abbreviation_zh = '九月';
      WHEN 10 THEN SET month_abbreviation_zh = '十月';
      WHEN 11 THEN SET month_abbreviation_zh = '十一月';
      WHEN 12 THEN SET month_abbreviation_zh = '十二月';
    END CASE;

    -- 计算中文季度名称
    CASE QUARTER(current_date1)
      WHEN 1 THEN SET quarter_name_zh = '第一季度';
      WHEN 2 THEN SET quarter_name_zh = '第二季度';
      WHEN 3 THEN SET quarter_name_zh = '第三季度';
      WHEN 4 THEN SET quarter_name_zh = '第四季度';
    END CASE;

    -- 插入日期数据
    INSERT INTO dim_date (
      `date`, 
      `date_short`, 
      `date_medium`, 
      `date_long`, 
      `date_full`, 
      `day_in_year`, 
      `day_in_month`, 
      `day_name`, 
      `day_abbreviation`, 
      `day_abbreviation_zh`, 
      `week_in_year`, 
      `week_in_month`, 
      `month_number`, 
      `month_abbreviation`, 
      `month_abbreviation_zh`, 
      `year2`, 
      `year4`, 
      `quarter_name`, 
      `quarter_name_zh`, 
      `quarter_number`, 
      `is_first_day_in_week`, 
      `is_last_day_in_week`, 
      `is_first_day_in_month`, 
      `is_last_day_in_month`, 
      `year_quarter`, 
      `year_month_number`, 
      `year_month_abbreviation`, 
      `date_key`
    ) VALUES (
      current_date1, 
      DATE_FORMAT(current_date1, '%y/%m/%d'),  -- 短日期格式
      DATE_FORMAT(current_date1, '%b %d, %Y'), -- 中日期格式
      DATE_FORMAT(current_date1, '%M %d, %Y'), -- 长日期格式
      DATE_FORMAT(current_date1, '%W, %M %d, %Y'), -- 完整日期格式
      DAYOFYEAR(current_date1),  -- 一年中的第几天
      DAY(current_date1),  -- 一月中的第几天
      DAYNAME(current_date1),  -- 完整星期几名称
      LEFT(DAYNAME(current_date1), 3),  -- 星期几缩写
      day_name_zh,  -- 中文星期几缩写
      WEEKOFYEAR(current_date1),  -- 一年中的第几周
      WEEK(current_date1, 5) - WEEK(DATE_SUB(current_date1, INTERVAL DAYOFMONTH(current_date1) - 1 DAY), 5) + 1, -- 一月中的第几周
      MONTH(current_date1),  -- 月份编号
      DATE_FORMAT(current_date1, '%b'), -- 月份缩写
      month_abbreviation_zh, -- 中文月份缩写
      DATE_FORMAT(current_date1, '%y'), -- 2位年份
      DATE_FORMAT(current_date1, '%Y'), -- 4位年份
      CONCAT('Q', QUARTER(current_date1)), -- 季度名称
      quarter_name_zh,  -- 中文季度名称
      QUARTER(current_date1),  -- 季度编号
      IF(DAYOFWEEK(current_date1) = 1, 1, 0), -- 是否为一周的第一天
      IF(DAYOFWEEK(current_date1) = 7, 1, 0), -- 是否为一周的最后一天
      IF(DAY(current_date1) = 1, 1, 0), -- 是否为一个月的第一天
      IF(LAST_DAY(current_date1) = current_date1, 1, 0), -- 是否为一个月的最后一天
      CONCAT(YEAR(current_date1), '-Q', QUARTER(current_date1)), -- 年度季度
      DATE_FORMAT(current_date1, '%Y-%m'), -- 年度月份编号
      DATE_FORMAT(current_date1, '%Y-%b'), -- 年度月份缩写
      DATE_FORMAT(current_date1, '%Y%m%d') -- 日期键
    );

    -- 将日期加1天

    SET current_date1 = DATE_ADD(current_date1, INTERVAL 1 DAY);
  END WHILE;
END
执行
call fill_dim_date('2024-01-01','2024-09-15')

在这里插入图片描述
在这里插入图片描述

技术点

设置全局变量 default_week_format
你可以通过设置 MySQL 的全局或会话变量 default_week_format 来更改默认的周计算方式,使得周一为一周的第一天。

SET @@global.default_week_format = 1;  -- 设置全局默认周格式,周一为一周的第一天
SET @@session.default_week_format = 1; -- 设置当前会话的默认周格式

此变量值 1 表示周一为一周的第一天。如果你需要在整个 MySQL 会话中使用周一作为一周的第一天,可以在会话开始时设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离谱碾压!奇安信中标:高出第二名近70分!

2024年08月09日&#xff0c;广东省政务服务和数据管理局&#xff0c;近日发布了网络安全第三方服务&#xff08;2024年&#xff09;项目之关基检查及重要政务应用安全检查服务招标公告&#xff01; 预算金额&#xff1a;2,896,200.00元&#xff0c;其中安全检查服务包&#xf…

Pytorch+Anaconda+Pycharm+Python

0 python知识 0.1 os库常见用法 os 库提供了许多用于操作操作系统功能的函数。常见用法包括&#xff1a; 文件和目录操作&#xff1a; os.listdir(path)&#xff1a;列出指定路径下的所有文件和目录。os.mkdir(path)&#xff1a;创建新目录。os.remove(path)&#xff1a;删除…

清理C盘缓存,删除电脑缓存指令是什么

在处理计算机系统的C盘缓存清理任务时&#xff0c;需要谨慎操作以确保系统的稳定性和数据的安全性。通常&#xff0c;Windows操作系统中并没有直接的“一键清理C盘缓存”的单一命令&#xff0c;因为缓存文件分散存储于多个位置&#xff0c;并且有些缓存对于系统性能至关重要&am…

【MySQL】EXPLAIN(执行计划)关键字是什么?

简介&#xff1a; explain是一个强大的 SQL 命令&#xff0c;用于分析和优化查询性能。通过查看数据库执行计划&#xff0c;我们可以理解查询是如何被处理的&#xff0c;包括表的访问顺序、使用的索引、连接类型等。这对于找到潜在的性能瓶颈非常重要。 目录 一、基本含义 二…

四、链表————相关概念详解

链表 前言一、链表是什么&#xff1f;二、链表的类型2.1 单向链表2.2 环形链表2.3 双向链表 三、链表中常用操作 (以单向列表为例)3.1 初始化链表3.2 判断链表是否为空3.3 获取链表长度3.4 插入节点3.4.1 链表头部添加节点3.4.2 链表尾部添加节点3.4.3 指定位置添加节点 3.5 删…

大数据处理技术:分布式文件系统HDFS

目录 1 实验名称&#xff1a; 2 实验目的 3 实验内容 4 实验原理 5 实验过程或源代码 5.1 HDFS的基本操作 5.2 HDFS-JAVA接口之读取文件 5.3 HDFS-JAVA接口之上传文件 5.4 HDFS-JAVA接口之删除文件 6 实验结果 6.1 HDFS的基本操作 6.2 HDFS-JAVA接口之读取文件 6.…

精通推荐算法30:行为序列建模之SIM— 基于检索建模长周期行为序列

1 行为序列建模总体架构 2 SIM提出的背景 MIMN第一次真正实现了长周期行为序列的建模&#xff0c;并取得了非常不错的业务效果。但受困于离线建模&#xff0c;它没办法实现用户行为序列和候选物品的交叉。同时采用一个固定大小的记忆网络来压缩超长序列&#xff0c;存在网络容…

redis-shake v4全量增量同步redis数据

1 概述 RedisShake是一个用于处理和迁移 Redis 数据的工具&#xff0c;github地址是https://github.com/tair-opensource/RedisShake。它提供以下特性&#xff1a; 1&#xff09;Redis 兼容性&#xff1a; RedisShake 兼容从 2.8 到 7.2 的 Redis 版本&#xff0c;并支持各种部…

Spring Event 业务解耦神器(泛型喔!)

一.前言 又与我一直负责Cocos Creator的开发,我发现在TS领域,是可以自定义事件(有兴趣的大宝可以坐飞机直达:[CocosCreator]自定义事件(订阅/发布)管理器),这样做有什么好处呢?回答:解耦! 于是乎,我就觉得前端能干的事,后端也一样能干!当然,如果后端是TS或JS写的,比如nodeJS,…

Cyber Weekly #24

赛博新闻 1、OpenAI发布最强模型o1 本周四&#xff08;9月12日&#xff09;&#xff0c;OpenAI宣布推出OpenAIo1系列模型&#xff0c;标志着AI推理能力的新高度。o1系列包括性能强大的o1以及经济高效的o1-mini&#xff0c;适用于不同复杂度的推理任务。新模型在科学、编码、数…

自动排课管理系统(源代码+论文+开题报告)

一、题目摘要 题目简要说明&#xff1a; 选排课系统功能的设计上&#xff0c;选排课系统可以分为登录、排课和选课3个子系统。登录子系统区分排课者(也即系统的管理者)、教师和学生这三者的不同身份&#xff0c;给出不同的权限&#xff0c;在页面中根据身份判断其相应具有的功…

Java 入门指南:JVM(Java虚拟机)——类的生命周期与加载过程

文章目录 类的生命周期类加载过程1&#xff09;载入&#xff08;Loading&#xff09;2&#xff09;验证&#xff08;Verification&#xff09;文件格式验证符号引用验证 3&#xff09;准备&#xff08;Preparation&#xff09;4&#xff09;解析&#xff08;Resolution&#xf…

FreeRTOS—任务通知

一&#xff0c;概念介绍 队列、信号量、事件组等IPC技术都需要创建一个中间对象进程之间通过这些中间对象进行通讯或同步。创建对象就需要分配内存&#xff0c;占用一定内存。 二&#xff0c;任务通知的特点&#xff1a; 一个任务或ISR向另外一个指定的任务发送通知&#xff0c…

2024年最新版Vue3学习笔记

本篇文章是记录来自尚硅谷禹神2023年课程的学习笔记&#xff0c;不得不说禹神讲的是真的超级棒&#xff01; 文章目录 创建Vue3工程main.ts文件解析初始化项目写一个简单的效果 Vue3核心语法setup函数setup和选项式的区别setup语法糖指定组件名称 响应式数据ref函数定义基本类…

C#学习系列之Gmap地图界面上的实时绘制问题

C#学习系列之Gmap地图界面上的实时绘制问题 前言总结 前言 在地图控件上增加绘制不规则图形&#xff0c;在之前的经验来看&#xff0c; System.InvalidOperationException:“无法使用 DependencyObject&#xff0c;它属于其父 Freezable 之外的其他线程。” 其实就是ui线程中…

9.15javaweb项目总结

1.贴吧界面算是完成了基本的 能通过url打开多个贴吧信息的界面了&#xff0c;界面水平不是很高&#xff0c;界面还有待提升&#xff0c;然后该界面的功能点还差点有点远&#xff0c;完成度不是很高。 2.解决了关注的功能问题 要考虑的地方有点多&#xff0c;最简单的就是点击…

SpringSecurity 5

springSecurity是spring的一个顶级项目 也是一个安全框架&#xff0c;可以在spring框架中直接引用。 springSecurity基于RBAC用来处理登录功能和各种权限校验。 〇、配置和运行springSecurity 导入security启动器和web启动器&#xff0c;写一个springBoot的启动类&#xff0c;可…

VMamba: Visual State Space Model 论文总结

题目&#xff1a;VMamba: Visual State Space Model&#xff08;视觉状态空间模型&#xff09; 论文&#xff1a;[2401.10166] VMamba: Visual State Space Model (arxiv.org) 源码&#xff1a;https://arxiv.org/pdf/2401.10166 (github.com) 目录 一、摘要 二、引言 三、方…

URP 线性空间 ui资源制作规范

前言&#xff1a; 关于颜色空间的介绍&#xff0c;可参阅 unity 文档 Color space URP实现了基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui资源在unity中进行透明度混合时&#xff…

嵌入式常用轻量级校验算法

在嵌入式中涉及通信基本都需要用到校验算法&#xff0c;如&#xff1a;UART常用的奇偶校验、CAN通信常用的CRC校验等等。下面我们将介绍几种常用的校验算法&#xff1a; 一、校验和 校验和是最基本&#xff0c;也是嵌入式软件工程师最常用的一种校验算法&#xff0c;其实现方法…