SQL 生成日历

生成日历是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日

相关文章

  • SQL 按字母表顺序排列字符

    要按字母表顺序排列字符,可以使用 SQL 中的 ORDER BY 子句,并在其中指定字符列。默认情况下,字符将按照升序排序。如果需要降序排序,可以添加 DESC 关键字。 以下是完整的攻略: 对于字符串类型的列(如 CHAR、VARCHAR、TEXT 等),可以直接使用 ORDER BY 子句进行排序: SELECT name FROM users ORDE…

    database 2023年3月27日
    00
  • SQL Server使用T-SQL语句批处理

    下面是SQL Server使用T-SQL语句批处理的攻略: 步骤1:创建一个批处理文件 要使用T-SQL语句批处理,首先需要创建一个批处理文件。该文件可以是文本文件,扩展名为 .sql。可以使用任何文本编辑器来创建此文件。 步骤2:编写T-SQL语句 在批处理文件中编写您想要执行的T-SQL语句。例如,下面的示例创建名为“employees”的表: CREA…

    database 2023年5月21日
    00
  • @Transactional注解异常报错之多数据源详解

    当使用 @Transactional 注解时,可能会遇到多数据源的异常问题。本篇攻略将会详细讲解这个问题的根本原因并且提供两个示例来说明。 1. 什么是多数据源 多数据源即指一个系统维护了多个数据库,每个数据库可能拥有不同的表或者对象。在应用程序中,连接各个数据库的连接信息通常是不同的。 2. 问题描述 当使用 @Transactional 注解时,会抛出异…

    database 2023年5月18日
    00
  • MySQL数据类型和常用字段属性总结

    MySQL中的数据类型大的方面来分,可以分为:日期和时间、数值,以及字符串。下面就分开来进行总结。 日期和时间数据类型 MySQL数据类型含义 date3字节,日期,格式:2014-09-18 time3字节,时间,格式:08:42:30 datetime8字节,日期时间,格式:2014-09-18 08:42:30 timestamp4字节,自动存储记录修…

    MySQL 2023年4月13日
    00
  • oracle ORA-01114、ORA-27067错误解决方法

    Oracle ORA-01114、ORA-27067错误解决方法 问题描述 当在Oracle数据库中执行操作时,可能会遇到ORA-01114和ORA-27067错误。ORA-01114错误信息如下: ORA-01114: IO error writing block to file (block # ) ORA-27067: I/O error on fil…

    database 2023年5月21日
    00
  • Mysql数据库存储过程基本语法讲解

    Mysql数据库存储过程基本语法讲解 存储过程是一种预编译的代码块,可以在MySQL数据库中创建和使用。它们是一些SQL语句的集合,可以在一起执行特定的任务。在存储过程中,可以定义变量、使用分支语句、循环语句等,从而实现复杂的业务逻辑。下面将介绍存储过程的基本语法。 创建存储过程 创建存储过程的语法如下: CREATE PROCEDURE procedure…

    database 2023年5月22日
    00
  • JSP动态实现web网页登陆和注册功能

    JSP(Java Server Pages)是一种使用Java编程语言编写的动态Web页面技术。在JSP中,使用Java代码、HTML、CSS、JavaScript和JSP页面特定元素来开发Web应用程序。 下面是实现JSP动态实现Web网页登陆和注册功能的完整攻略: 第一步:搭建Web应用程序 要实现令人担心的Web登录和注册功能,必须首先建立您的Web应…

    database 2023年5月22日
    00
  • sqlserver2005 master与msdb数据库备份恢复过程

    备份和恢复是SQL Server数据库管理中的重要方面。在备份和恢复过程中,Master数据库和MSDB数据库也需要特别注意。下面是SQL Server 2005中Master和MSDB数据库备份恢复的完整攻略: 备份Master数据库 Master数据库是SQL Server中最重要的系统数据库之一,该数据库包含SQL Server实例配置信息、用户账户和…

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