我如何组合一个查询来显示下周的所有时间,因为我想将时间表与此进行比较以用于预约目的。
感谢您的帮助!
编辑--
预期结果在 9 到 5 之间就很好
|客户日期 | client_time |
2010年10月1日 09:00:00
2010年10月1日 10:00:00
2010年10月1日 11:00:00
2010年10月1日 12:00:00
2010年10月1日 13:00:00
2010年10月1日 14:00:00
2010年10月1日 15:00:00
2010年10月1日 16:00:00
2010年10月1日 17:00:00
最佳答案
您需要创建一个表来存储日期和时间值。
CREATE TABLE calendarhours (caldaytime DATETIME);
然后,您需要创建一个存储过程来循环这两个日期,并将时间表时间的日期时间值插入表中。
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `timesheetdays`(startdate DATETIME, enddate DATETIME)
BEGIN
DECLARE tempdate DATETIME;
DELETE FROM `calendarhours`;
-- set the temp date to 9am of the start date
SET tempdate = DATE_ADD(DATE(startdate), INTERVAL '0 9' DAY_HOUR);
-- while the temp date is less than or equal to the end date, insert the date
-- into the temp table
WHILE ( tempdate <= enddate ) DO
BEGIN
-- insert temp date into temp table
INSERT INTO `calendarhours` (caldaytime) VALUES (tempdate);
-- increment temp date by an hour
SET tempdate = DATE_ADD(tempdate, INTERVAL '0 1' DAY_HOUR);
-- if the temp date is greater than 5 PM (17:00) then increment to the next day
IF TIMEDIFF(tempdate, DATE_ADD(DATE(tempdate), INTERVAL '0 17' DAY_HOUR)) > 0 THEN
BEGIN
-- increment to the next day
SET tempdate = DATE_ADD(DATE(tempdate), INTERVAL '1 9' DAY_HOUR);
-- for business purposes, if the day is a Saturday or a Sunday increment
-- until we reach Monday
WHILE ( DAYNAME(tempdate) = 'Saturday' OR DAYNAME(tempdate) = 'Sunday' ) DO
BEGIN
SET tempdate = DATE_ADD(DATE(tempdate), INTERVAL '1 9' DAY_HOUR);
END;
END WHILE;
END;
END IF;
END;
END WHILE;
-- return all the inserted date and times
SELECT * FROM calendarhours ORDER BY caldaytime;
END
此过程将循环遍历两个日期,从每天上午 9 点开始,到每天下午 5 点 (17:00) 结束。当时间到达 18:00 时,该过程将递增到第二天,并在上午 9 点再次开始。
如果您正在制作标准工作周时间表,那么如果该天等于星期六或星期日,它将递增,直到到达星期一。
为了测试这一点,我使用了以下语句:
CALL `timesheetdays`(NOW(), DATE_ADD(DATE(NOW()), INTERVAL '5 0' DAY_HOUR));
SELECT * FROM `calendarhours`;
这会测试从今天到今天后 5 天的程序,并根据需要显示时间。第一个语句将记录添加到表中,然后返回记录,第二个语句从表中返回记录。
关于MySQL 查询显示下个月内的所有小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859611/