mysql怎么去除节假日
时间 : 2023-03-09 02:35:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

如果要在 MySQL 中去除节假日,可以采用以下两种方法:

1. 利用日历表实现

可以创建一个包含所有日期的日历表,然后在该表中标识出所有的节假日,最后在查询时使用 WHERE 子句过滤掉这些日期即可。

下面是一个示例 SQL 语句,可以创建一个包含 2020 年所有日期的日历表:

```sql

CREATE TABLE calendar (

date DATE PRIMARY KEY,

year SMALLINT,

quarter TINYINT,

month TINYINT,

day TINYINT,

week TINYINT,

day_name VARCHAR(9),

is_holiday BOOLEAN

);

INSERT INTO calendar (date, year, quarter, month, day, week, day_name, is_holiday)

SELECT

DATE(NOW() - INTERVAL cnt DAY),

YEAR(NOW() - INTERVAL cnt DAY),

QUARTER(NOW() - INTERVAL cnt DAY),

MONTH(NOW() - INTERVAL cnt DAY),

DAY(NOW() - INTERVAL cnt DAY),

WEEK(NOW() - INTERVAL cnt DAY),

DATE_FORMAT(NOW() - INTERVAL cnt DAY, '%W'),

CASE DATE_FORMAT(NOW() - INTERVAL cnt DAY, '%Y%m%d')

WHEN "20200101" THEN 1 -- 元旦

WHEN "20200124" THEN 1 -- 春节

WHEN "20200127" THEN 1 -- 春节

WHEN "20200128" THEN 1 -- 春节

WHEN "20200129" THEN 1 -- 春节

WHEN "20200130" THEN 1 -- 春节

WHEN "20200404" THEN 1 -- 清明节

WHEN "20200405" THEN 1 -- 清明节

WHEN "20200406" THEN 1 -- 清明节

WHEN "20200501" THEN 1 -- 劳动节

WHEN "20200502" THEN 1 -- 劳动节

WHEN "20200503" THEN 1 -- 劳动节

WHEN "20200504" THEN 1 -- 劳动节

WHEN "20200625" THEN 1 -- 端午节

WHEN "20200626" THEN 1 -- 端午节

WHEN "20200627" THEN 1 -- 端午节

WHEN "20201001" THEN 1 -- 国庆节

WHEN "20201002" THEN 1 -- 国庆节

WHEN "20201003" THEN 1 -- 国庆节

WHEN "20201004" THEN 1 -- 国庆节

WHEN "20201005" THEN 1 -- 国庆节

WHEN "20201006" THEN 1 -- 国庆节

WHEN "20201007" THEN 1 -- 国庆节

ELSE 0

END

FROM (

SELECT a + b * 10 + c * 100 AS cnt

FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a

JOIN (SELECT 0 AS b UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b

JOIN (SELECT 0 AS c UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) c

) days

WHERE cnt <= DATEDIFF(NOW(), '2020-01-01');

在这个示例中,我们将所有的节假日标为 1,非节假日标为 0。

然后,查询时可以使用以下语句过滤掉所有的节假日:

```sql

SELECT * FROM calendar WHERE is_holiday = 0;

2. 利用 UDF 实现

MySQL 中可以使用用户自定义函数(UDF)实现对节假日的过滤。实现 UDF 可以参考以下步骤:

1. 下载 UDF 库,例如 `libudf_date_functions.so`;

2. 将库文件放入 MySQL 插件目录,并在 MySQL 配置文件中添加以下行:

```text

plugin_dir=/usr/lib/mysql