Mysql 计算两次之间的小时数
几天前我问了一个类似的问题,但对于我所寻找的东西,特别是SQL(问题是) 基本上,我有以下问题:Mysql 计算两次之间的小时数,mysql,sql,Mysql,Sql,几天前我问了一个类似的问题,但对于我所寻找的东西,特别是SQL(问题是) 基本上,我有以下问题: SELECT DAYNAME(arrivalTime) AS day, COUNT(*) AS count FROM bookings WHERE HOUR(arrivalTime) = 13 AND DAYNAME(arrivalTime) = 'Monday' 这将计算星期一13:00开始的预订的条目数。如何更改此设置,以便计算从到达时间到取车时间的每一小时 例
SELECT DAYNAME(arrivalTime) AS day, COUNT(*) AS count
FROM bookings
WHERE HOUR(arrivalTime) = 13
AND DAYNAME(arrivalTime) = 'Monday'
这将计算星期一13:00开始的预订的条目数。如何更改此设置,以便计算从到达时间到取车时间的每一小时
例如,如果我的到达时间-拾取时间为13:00-17:00那么13:00、14:00、15:00和16:00都会将其计算为一个条目
他提出了一些建议,但没有真正做到
编辑:
我正在制作的日历:
我的数据库:
样本和预期输出:
arrivalTime - pickupTime
13 - 15 (hours 13, 14 are counted)
10 - 14 (hours 10, 11, 12, 13 are counted)
16 - 17 (hours 16 are counted)
13 - 17 (hours 13, 14, 15, 16 are counted)
11 - 12 (hours 11 are counted)
DELIMITER $$
DROP FUNCTION IF EXISTS fn_getCount;
CREATE FUNCTION fn_getCount(p_weekDate DATE, p_dayName VARCHAR(10), p_fromHour INT, p_toHour INT)
RETURNS INT
BEGIN
DECLARE v_count INT;
SELECT COUNT(b.arrivalTime) INTO v_count
FROM bookings b
WHERE
((HOUR(b.arrivalTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.pickupTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.arrivalTime) < p_fromHour AND HOUR(b.pickupTime) > p_toHour - 1)) AND
DAYNAME(b.arrivalTime) = p_dayName AND
(DATE(b.arrivalTime) BETWEEN fn_firstDayOfWeek(p_weekDate) AND DATE_ADD(fn_firstDayOfWeek(p_weekDate), INTERVAL 6 DAY));
RETURN v_count;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_GetCalendar;
CREATE PROCEDURE sp_GetCalendar(
p_weekDate DATE,
p_fromHour INT,
p_toHour INT
)
BEGIN
DECLARE v_currHour INT;
DROP TEMPORARY TABLE IF EXISTS Calendar;
CREATE TEMPORARY TABLE Calendar
(
Hours VARCHAR(30),
Monday VARCHAR(30),
Tuesday VARCHAR(30),
Wednesday VARCHAR(30),
Thursday VARCHAR(30),
Friday VARCHAR(30),
Saturday VARCHAR(30),
Sunday VARCHAR(30)
);
SET v_currHour = p_fromHour;
START TRANSACTION;
WHILE (v_currHour < p_toHour) DO
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT(v_currHour, ':00 - ', v_currHour + 1, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) END);
SET v_currHour = v_currHour + 1;
END WHILE;
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT('Total: ', p_fromHour, ':00 - ', p_toHour, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) END);
COMMIT;
SELECT * FROM Calendar;
DROP TEMPORARY TABLE IF EXISTS Calendar;
END$$
DELIMITER ;
CALL sp_GetCalendar('2015-11-07', 10, 17);
SELECT fn_getCount('2015-11-07', 'Saturday', 10, 17);
SELECT fn_firstDayOfWeek('2015-11-07');
基本上,现在它只是简单地计算到达时间为X的条目数。因此,如果我们有10个条目在星期一的13:00开始,在我链接的HTML表上,它将在13:00旁边有数字10。我想让它每小时都在计算到底有多少次预订
为了使它更容易想象,这是简单地把一个狗窝。我们正在检查每小时养多少只狗。因此,如果预订时间为13:00-15:00,则不应仅将+1添加到13:00,还应添加到14:00,因为时间重叠。也许比我想象的要复杂一点
编辑2:
现在我的函数中有了这个查询
SELECT DAYNAME(arrivalTime) AS day, COUNT(*) AS count
FROM bookings
WHERE HOUR(arrivalTime) = $hour
AND DAYNAME(arrivalTime) = '$dayname'
在HTML中,我像这样传递值
<td>
<span>
<p style="float:left">10:00</p>
<p style="float:right"> (<?php $var->get_CalendarCount($conn,10,'Monday'); ?>)</p>
</span>
</td>
10:00
()
你是说像这样
SELECT DAYNAME(arrivalTime) AS day, COUNT(arrivalTime) AS count
FROM bookings
WHERE TIME(arrivalTime) BETWEEN '13:00:00' AND '17:00:00'
AND DAYNAME(arrivalTime) = 'Monday'
或者,如果您只需要13、14、15、16、17,那么:
SELECT DAYNAME(arrivalTime) AS day, COUNT(arrivalTime) AS count
FROM bookings
WHERE (TIME(arrivalTime) BETWEEN '13:00:00' AND '17:00:00')
AND MINUTE(TIME(arrivalTime)) = 0
AND SECOND(TIME(arrivalTime)) = 0
AND DAYNAME(arrivalTime) = 'Monday'
//编辑以回答评论
因此,您需要计算13:00-13.59、14:00-14:59等时段(例如)13:00-17:00之间的预订量
SELECT DAYNAME(arrivalTime) AS day, COUNT(arrivalTime) AS count, CONCAT(HOUR(arrivalTime), ':00 - ', HOUR(arrivalTime) + 1, ':00') as Hours
FROM bookings
WHERE (HOUR(arrivalTime) BETWEEN '13' AND '17')
AND DAYNAME(arrivalTime) = 'Monday'
GROUP BY HOUR(arrivalTime);
//编辑2
不幸的是,我现在没有时间修复我编写的查询,但是使用函数而不是单一选择(每一个小时进行一次选择)会更容易
但有两件事:
arrivalTime - pickupTime
13 - 15 (hours 13, 14 are counted)
10 - 14 (hours 10, 11, 12, 13 are counted)
16 - 17 (hours 16 are counted)
13 - 17 (hours 13, 14, 15, 16 are counted)
11 - 12 (hours 11 are counted)
DELIMITER $$
DROP FUNCTION IF EXISTS fn_getCount;
CREATE FUNCTION fn_getCount(p_weekDate DATE, p_dayName VARCHAR(10), p_fromHour INT, p_toHour INT)
RETURNS INT
BEGIN
DECLARE v_count INT;
SELECT COUNT(b.arrivalTime) INTO v_count
FROM bookings b
WHERE
((HOUR(b.arrivalTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.pickupTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.arrivalTime) < p_fromHour AND HOUR(b.pickupTime) > p_toHour - 1)) AND
DAYNAME(b.arrivalTime) = p_dayName AND
(DATE(b.arrivalTime) BETWEEN fn_firstDayOfWeek(p_weekDate) AND DATE_ADD(fn_firstDayOfWeek(p_weekDate), INTERVAL 6 DAY));
RETURN v_count;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_GetCalendar;
CREATE PROCEDURE sp_GetCalendar(
p_weekDate DATE,
p_fromHour INT,
p_toHour INT
)
BEGIN
DECLARE v_currHour INT;
DROP TEMPORARY TABLE IF EXISTS Calendar;
CREATE TEMPORARY TABLE Calendar
(
Hours VARCHAR(30),
Monday VARCHAR(30),
Tuesday VARCHAR(30),
Wednesday VARCHAR(30),
Thursday VARCHAR(30),
Friday VARCHAR(30),
Saturday VARCHAR(30),
Sunday VARCHAR(30)
);
SET v_currHour = p_fromHour;
START TRANSACTION;
WHILE (v_currHour < p_toHour) DO
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT(v_currHour, ':00 - ', v_currHour + 1, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) END);
SET v_currHour = v_currHour + 1;
END WHILE;
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT('Total: ', p_fromHour, ':00 - ', p_toHour, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) END);
COMMIT;
SELECT * FROM Calendar;
DROP TEMPORARY TABLE IF EXISTS Calendar;
END$$
DELIMITER ;
CALL sp_GetCalendar('2015-11-07', 10, 17);
SELECT fn_getCount('2015-11-07', 'Saturday', 10, 17);
SELECT fn_firstDayOfWeek('2015-11-07');
将整个日历生成为透视表的过程:
arrivalTime - pickupTime
13 - 15 (hours 13, 14 are counted)
10 - 14 (hours 10, 11, 12, 13 are counted)
16 - 17 (hours 16 are counted)
13 - 17 (hours 13, 14, 15, 16 are counted)
11 - 12 (hours 11 are counted)
DELIMITER $$
DROP FUNCTION IF EXISTS fn_getCount;
CREATE FUNCTION fn_getCount(p_weekDate DATE, p_dayName VARCHAR(10), p_fromHour INT, p_toHour INT)
RETURNS INT
BEGIN
DECLARE v_count INT;
SELECT COUNT(b.arrivalTime) INTO v_count
FROM bookings b
WHERE
((HOUR(b.arrivalTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.pickupTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.arrivalTime) < p_fromHour AND HOUR(b.pickupTime) > p_toHour - 1)) AND
DAYNAME(b.arrivalTime) = p_dayName AND
(DATE(b.arrivalTime) BETWEEN fn_firstDayOfWeek(p_weekDate) AND DATE_ADD(fn_firstDayOfWeek(p_weekDate), INTERVAL 6 DAY));
RETURN v_count;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_GetCalendar;
CREATE PROCEDURE sp_GetCalendar(
p_weekDate DATE,
p_fromHour INT,
p_toHour INT
)
BEGIN
DECLARE v_currHour INT;
DROP TEMPORARY TABLE IF EXISTS Calendar;
CREATE TEMPORARY TABLE Calendar
(
Hours VARCHAR(30),
Monday VARCHAR(30),
Tuesday VARCHAR(30),
Wednesday VARCHAR(30),
Thursday VARCHAR(30),
Friday VARCHAR(30),
Saturday VARCHAR(30),
Sunday VARCHAR(30)
);
SET v_currHour = p_fromHour;
START TRANSACTION;
WHILE (v_currHour < p_toHour) DO
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT(v_currHour, ':00 - ', v_currHour + 1, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) END);
SET v_currHour = v_currHour + 1;
END WHILE;
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT('Total: ', p_fromHour, ':00 - ', p_toHour, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) END);
COMMIT;
SELECT * FROM Calendar;
DROP TEMPORARY TABLE IF EXISTS Calendar;
END$$
DELIMITER ;
CALL sp_GetCalendar('2015-11-07', 10, 17);
SELECT fn_getCount('2015-11-07', 'Saturday', 10, 17);
SELECT fn_firstDayOfWeek('2015-11-07');
输出:
arrivalTime - pickupTime
13 - 15 (hours 13, 14 are counted)
10 - 14 (hours 10, 11, 12, 13 are counted)
16 - 17 (hours 16 are counted)
13 - 17 (hours 13, 14, 15, 16 are counted)
11 - 12 (hours 11 are counted)
DELIMITER $$
DROP FUNCTION IF EXISTS fn_getCount;
CREATE FUNCTION fn_getCount(p_weekDate DATE, p_dayName VARCHAR(10), p_fromHour INT, p_toHour INT)
RETURNS INT
BEGIN
DECLARE v_count INT;
SELECT COUNT(b.arrivalTime) INTO v_count
FROM bookings b
WHERE
((HOUR(b.arrivalTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.pickupTime) BETWEEN p_fromHour AND p_toHour - 1) OR
(HOUR(b.arrivalTime) < p_fromHour AND HOUR(b.pickupTime) > p_toHour - 1)) AND
DAYNAME(b.arrivalTime) = p_dayName AND
(DATE(b.arrivalTime) BETWEEN fn_firstDayOfWeek(p_weekDate) AND DATE_ADD(fn_firstDayOfWeek(p_weekDate), INTERVAL 6 DAY));
RETURN v_count;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_GetCalendar;
CREATE PROCEDURE sp_GetCalendar(
p_weekDate DATE,
p_fromHour INT,
p_toHour INT
)
BEGIN
DECLARE v_currHour INT;
DROP TEMPORARY TABLE IF EXISTS Calendar;
CREATE TEMPORARY TABLE Calendar
(
Hours VARCHAR(30),
Monday VARCHAR(30),
Tuesday VARCHAR(30),
Wednesday VARCHAR(30),
Thursday VARCHAR(30),
Friday VARCHAR(30),
Saturday VARCHAR(30),
Sunday VARCHAR(30)
);
SET v_currHour = p_fromHour;
START TRANSACTION;
WHILE (v_currHour < p_toHour) DO
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT(v_currHour, ':00 - ', v_currHour + 1, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', v_currHour, v_currHour + 1) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', v_currHour, v_currHour + 1) END);
SET v_currHour = v_currHour + 1;
END WHILE;
INSERT INTO Calendar (Hours, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
VALUES (
CONCAT('Total: ', p_fromHour, ':00 - ', p_toHour, ':00'),
CASE WHEN fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Monday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Tuesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Wednesday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Thursday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Friday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Saturday', p_fromHour, p_toHour) END,
CASE WHEN fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) = 0 THEN 'x' ELSE fn_getCount(p_weekDate, 'Sunday', p_fromHour, p_toHour) END);
COMMIT;
SELECT * FROM Calendar;
DROP TEMPORARY TABLE IF EXISTS Calendar;
END$$
DELIMITER ;
CALL sp_GetCalendar('2015-11-07', 10, 17);
SELECT fn_getCount('2015-11-07', 'Saturday', 10, 17);
SELECT fn_firstDayOfWeek('2015-11-07');
代码可能有点多余,但我的时间确实很短。我想即使在特定的时间内没有预订,您也需要计算一下。你需要一个小时的桌子来做这个
SELECT H.day_name AS day,
Count(b.arrivaltime) AS count
FROM hour_table H
LEFT OUTER JOIN bookings B
ON h.day_name = Dayname(arrivaltime)
AND h.hours = Hour(arrivaltime)
WHERE h.hours BETWEEN 13 AND 17
AND h.day_name = 'Monday'
GROUP BY H.day_name
编辑:如果您不想统计X
和Y
之间的所有预订。然后需要条件聚合。像这样的
Count(case when h.hours BETWEEN 13 AND 17 then b.arrivaltime .. end) AS count
当有足够的问题信息时,您可以添加完整答案以使其更容易可视化这是我正在制作的日历:。这是我的数据库:。我不想让每个预订都检查X到17之间的计数,因为这会计算13:00到15:00之间的预订,对吗?所以即使16:00也会加上+1计数,这当然是不正确的。@LiamMacmillan-仍然不清楚。您可以添加示例记录和预期输出完成吗。希望能让我想要的更清楚一点。如果仍然不够清楚,我将在表中发布SQL数据,并提供预期的输出。嘿,你能检查我对MM93答案的评论吗?我相信是同样的问题。你想要这样的东西?不完全是因为它不够具体。看看我在问题上编辑了什么。嗯,我仍然在努力做到这一点。比我想象的要复杂得多。查看我的输入/预期输出,以便更好地了解我在寻找什么(我编辑了我的帖子)。我当前的查询可以很好地计算在某个时间开始的预订数量,但我需要这样做,以便每小时检查是否有其他预订超过该小时。请查看我所做的更新,我希望这是您正在寻找的。