SQL 生成日历

yizhihongxing

生成日历是SQL语言中的一个经典问题。下面我将介绍如何使用SQL生成日历。

创建日历表

首先,我们需要先创建一个日历表。以下是创建日历表的SQL代码:

CREATE TABLE calendar (
  `date` date NOT NULL PRIMARY KEY,
  year int(4) NOT NULL,
  month int(2) NOT NULL,
  day int(2) NOT NULL,
  quarter int(1) NOT NULL,
  week int(2) NOT NULL,
  dayofweek int(1) NOT NULL,
  dayofyear int(3) NOT NULL,
  holiday varchar(50),
  weekend int(1) NOT NULL,
  lunar_year int(4),
  lunar_month int(2),
  lunar_day int(2),
  solar_term varchar(10)
);

插入数据

然后,我们需要插入数据来填充日历表。以下是插入数据的SQL代码:

--生成数据1900-01-01到2100-12-31
SET @start_date = '1900-01-01';
SET @end_date = '2100-12-31';

WHILE @start_date <= @end_date DO
  INSERT INTO calendar (
    `date`,
    year,
    month,
    day,
    quarter,
    week,
    dayofweek,
    dayofyear,
    weekend,
    holiday,
    lunar_year,
    lunar_month,
    lunar_day,
    solar_term
  ) VALUES (
    @start_date,
    YEAR(@start_date),
    MONTH(@start_date),
    DAY(@start_date),
    QUARTER(@start_date),
    WEEKOFYEAR(@start_date),
    DAYOFWEEK(@start_date),
    DAYOFYEAR(@start_date),
    IF(weekday(@start_date)=5 OR weekday(@start_date)=6, 1, 0),
    NULL,
    NULL,
    NULL,
    NULL
  );

  SET @start_date = DATE_ADD(@start_date, INTERVAL 1 DAY);
END WHILE;

--添加节日
UPDATE calendar SET holiday = '元旦节' WHERE month = 1 AND day = 1;
UPDATE calendar SET holiday = '春节' WHERE month = 2 AND day = 5;
UPDATE calendar SET holiday = '清明节' WHERE month = 4 AND day = 4;
UPDATE calendar SET holiday = '劳动节' WHERE month = 5 AND day = 1;
UPDATE calendar SET holiday = '端午节' WHERE month = 6 AND day = 2;
UPDATE calendar SET holiday = '中秋节' WHERE month = 9 AND day = 15;
UPDATE calendar SET holiday = '国庆节' WHERE month = 10 AND day = 1;

查询数据

有了日历表的数据,我们就可以使用SQL语句轻松地生成日历了。以下是两个具体的实例:

实例1:按周生成日历

我们可以按周生成一个日历。如下所示:

SELECT
  year,
  week,
  CONCAT(MAX(CASE WHEN dayofweek = 2 THEN `date` END), ',',
         MAX(CASE WHEN dayofweek = 3 THEN `date` END), ',',
         MAX(CASE WHEN dayofweek = 4 THEN `date` END), ',',
         MAX(CASE WHEN dayofweek = 5 THEN `date` END), ',',
         MAX(CASE WHEN dayofweek = 6 THEN `date` END), ',',
         MAX(CASE WHEN dayofweek = 7 THEN `date` END)) AS week_range
FROM calendar
GROUP BY year, week;

该查询会生成以年和周为分组的日历,其中包含每周的日期范围。

实例2:按月生成日历

我们也可以按月生成一个日历。如下所示:

SELECT 
  *,
  CONCAT(YEAR(`date`), '-', LPAD(MONTH(`date`), 2, '0'), '-', LPAD(DAY(`date`), 2, '0')) AS `full_date`
FROM
  calendar
WHERE 
  year = 2021 AND month = 9
ORDER BY `date` ASC;

该查询会生成一个以2021年9月为基础的月份日历,并按日期升序排序。

总之,使用以上的方法,我们可以轻松地使用SQL生成日历表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL 生成日历 - Python技术站

(0)
上一篇 2023年3月27日
下一篇 2023年3月27日

相关文章

  • 用PHP调用Oracle存储过程

    下面我将给你详细讲解“用PHP调用Oracle存储过程”的完整攻略。 1. 安装Oracle驱动程序 要使用PHP调用Oracle存储过程,我们首先需要安装Oracle官方提供的驱动程序。可以在这个页面下载适合自己系统的驱动版本。下载后,解压缩到合适的位置,并将解压缩后的路径添加到系统环境变量中。其实,我们最好将Oracle的路径设置为PATH环境变量中,这…

    database 2023年5月21日
    00
  • sqoop读取postgresql数据库表格导入到hdfs中的实现

    sqoop读取postgresql数据库表格导入到hdfs中的实现 Sqoop是一个开源工具,用于将关系型数据库和数据仓库(例如PostgreSQL)中的数据传输到Hadoop的HDFS(Hadoop分布式文件系统)/ Hive中。Sqoop支持批量导入和导出,支持多种数据源的数据传输。 步骤一:安装sqoop 首先,下载和安装sqoop所需的jar包以及h…

    database 2023年5月18日
    00
  • LNMP下FTP服务器的安装与使用方法(Pureftpd和Proftpd)

    LNMP是Linux+Nginx+MySQL+PHP的简称,为开发及运维者提供了一种快速搭建Web服务的解决方案。这里给出关于LNMP下Pureftpd和Proftpd两种FTP服务器的安装及使用方法。以下步骤在CentOS 7系统上进行测试通过。 安装Pureftpd 确保系统中已经安装epel扩展源和remi扩展源,如果没有安装可以使用以下命令进行安装:…

    database 2023年5月22日
    00
  • MySQL 性能优化的最佳20多条经验分享

    MySQL 性能优化是一个非常重要的领域,通过优化MySQL性能可提高网站访问速度、用户体验和查询效率。下面我将分享MySQL性能优化的最佳20多条经验,希望对你有所帮助。 1. 使用优化配置 MySQL默认配置不一定是最优的,通过修改配置文件可以提高MySQL性能。具体的优化配置请参考《MySQL性能优化的最佳20多条经验分享》。 2. 避免大量使用”SE…

    database 2023年5月19日
    00
  • 如何使用Python在MySQL中使用外键?

    在MySQL中,可以使用外键来建立表之间的关系。在Python中,可以使用MySQL连接来执行外键查询。以下是在Python中使用外键的完整攻略,包括外键的基本语法、使用外键的示例及如何在Python中使用外键。 外键的基本语法 在MySQL中,可以使用FOREIGN KEY关键字来创建外键以下是创建外键的基本语法: CREATE TABLE table_n…

    python 2023年5月12日
    00
  • 图文并茂地讲解Mysql索引(index)

    下面我将为您详细讲解“图文并茂地讲解Mysql索引(index)”的完整攻略。 1. 什么是索引(index) 索引(index)是一种能够加快在数据库表中查找某列值的数据结构,它可以让数据库系统快速定位到包含查找值的行。在 MySQL 数据库中,主键(primary key index)就是一种特殊的索引。 2. 索引类型 MySQL 支持多种类型的索引,…

    database 2023年5月19日
    00
  • 如何让你的SQL运行得更快

    如何让你的SQL运行得更快 优化SQL查询是每个开发者都需要面对的挑战。优化查询的好处不仅仅是减少数据库资源的占用,还能提高用户体验,减少查询结果的等待时间。下面是一些可以让你的SQL查询更快的技巧。 索引优化 索引是最常用的优化技术之一。一个好的索引能够帮助查询语句更快的定位到数据,并节省整个查询过程的时间。在编写查询语句时,可以尝试使用索引优化器,让数据…

    database 2023年5月19日
    00
  • Mysql中Binlog3种格式的介绍与分析

    下面是关于Mysql中Binlog3种格式的介绍与分析的完整攻略。 1. 什么是Binlog Binlog是MySQL中的二进制日志(Binary Log)。 其记录了所有对数据库的更新操作,如增、删、改,而这些操作是以二进制的方式保存的,因此称之为二进制日志。 在数据恢复和数据复制中,二进制日志发挥着至关重要的作用。 Binlog根据具体的实现方式可分为三…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部