sql 仅在工作日插入数据
sql insert data only in working days
我有非常简单的 table 结构如下:
id int
info varchar
user varchar
start_date datatime
end_date datatime
resources_id int
我必须插入许多行(例如未来两年),这些行将只包含工作日的数据 - 来自字段的数据只是一个简单的副本,但我不知道如何为这种类型的插入做准备具体工作日。有可能做到吗?
我的示例转储文件如下所示:
id info user start_date end_date resource_id
31 NULL aorlik 2018-01-04 08:00:00 2018-01-04 10:00:00 1
32 NULL aorlik 2018-01-04 15:00:00 2018-01-04 17:00:00 1
给你。
我创建了一个数据库函数来创建一整年的日期。你可以根据自己的意愿微调,但你应该明白了。
它基本上循环一年中的所有日子,如果这一天恰好是 sat
或 sun
,它会跳过日期。您可以根据自己的喜好进行更改。
为此,我创建了一个带有 2 个日期时间字段(start_date、end_date)的测试 table。在函数内部,我截断了 table,只是为了测试目的。
DROP PROCEDURE IF EXISTS create_date_for_year;
DELIMITER //
CREATE PROCEDURE create_date_for_year (IN year INT)
BEGIN
DECLARE day INT DEFAULT 1;
SET day=1;
TRUNCATE test; -- JUST FOR TESTING!
WHILE day < 366 DO
IF WEEKDAY(MAKEDATE(year, day)) NOT IN (5,6) THEN -- skip sat and sun
INSERT INTO TEST (start_date, end_date) VALUES (
CONCAT(MAKEDATE(year, day), ' ', MAKETIME(8,0,0)),
CONCAT(MAKEDATE(year, day), ' ', MAKETIME(10,0,0))
);
END IF;
SET day = day + 1;
END WHILE;
END;
//
CALL create_date_for_year(2018)
我有非常简单的 table 结构如下:
id int
info varchar
user varchar
start_date datatime
end_date datatime
resources_id int
我必须插入许多行(例如未来两年),这些行将只包含工作日的数据 - 来自字段的数据只是一个简单的副本,但我不知道如何为这种类型的插入做准备具体工作日。有可能做到吗?
我的示例转储文件如下所示:
id info user start_date end_date resource_id
31 NULL aorlik 2018-01-04 08:00:00 2018-01-04 10:00:00 1
32 NULL aorlik 2018-01-04 15:00:00 2018-01-04 17:00:00 1
给你。
我创建了一个数据库函数来创建一整年的日期。你可以根据自己的意愿微调,但你应该明白了。
它基本上循环一年中的所有日子,如果这一天恰好是 sat
或 sun
,它会跳过日期。您可以根据自己的喜好进行更改。
为此,我创建了一个带有 2 个日期时间字段(start_date、end_date)的测试 table。在函数内部,我截断了 table,只是为了测试目的。
DROP PROCEDURE IF EXISTS create_date_for_year;
DELIMITER //
CREATE PROCEDURE create_date_for_year (IN year INT)
BEGIN
DECLARE day INT DEFAULT 1;
SET day=1;
TRUNCATE test; -- JUST FOR TESTING!
WHILE day < 366 DO
IF WEEKDAY(MAKEDATE(year, day)) NOT IN (5,6) THEN -- skip sat and sun
INSERT INTO TEST (start_date, end_date) VALUES (
CONCAT(MAKEDATE(year, day), ' ', MAKETIME(8,0,0)),
CONCAT(MAKEDATE(year, day), ' ', MAKETIME(10,0,0))
);
END IF;
SET day = day + 1;
END WHILE;
END;
//
CALL create_date_for_year(2018)