Mysql 计算两次之间的小时数

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开始的预订的条目数。如何更改此设置,以便计算从到达时间到取车时间的每一小时 例

几天前我问了一个类似的问题,但对于我所寻找的东西,特别是SQL(问题是)

基本上,我有以下问题:

    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">&nbsp;&nbsp;&nbsp;(<?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

不幸的是,我现在没有时间修复我编写的查询,但是使用函数而不是单一选择(每一个小时进行一次选择)会更容易

但有两件事:

  • 如果您希望从ex:10:00-17:00(ex:10:00-10:59)开始的每一小时都使用它,那么它将是所有在10:00和10:59之间具有拾取时间或到达时间的记录
  • 如果你想从10:00-17:00这段时间里得到总数,它不会是一个总和,因为会有重复项,例如:10:00-10:59可能包含与11:00-11:59相同的记录
  • //编辑3

    当您为日历的任何单元格调用此函数时,请检查此函数是否满足您的需要。如果要返回x而不是零,只需输入If并返回char。它的工作时间应为10:00-10:59(一小时周期)或10:00-16:59(总周期)

    我不知道php,我知道.NET,但是如果你想让服务器返回一个完整的表,你可以简单地创建一个存储过程,在需要的地方调用这个函数,然后从php调用这个过程。我不是专家,但如果您希望服务器返回整个日历,则必须创建透视表

    //编辑4(30-11-2015 00:04)

    这里有一个用于单个单元格的函数和生成整个日历的存储过程,我添加了一个函数来评估提供日期的一周的第一天,因为您需要提供日期,否则它将返回所有的星期一,而不仅仅是您感兴趣的一周中的一天

    用于评估单个单元格的函数:

    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答案的评论吗?我相信是同样的问题。你想要这样的东西?不完全是因为它不够具体。看看我在问题上编辑了什么。嗯,我仍然在努力做到这一点。比我想象的要复杂得多。查看我的输入/预期输出,以便更好地了解我在寻找什么(我编辑了我的帖子)。我当前的查询可以很好地计算在某个时间开始的预订数量,但我需要这样做,以便每小时检查是否有其他预订超过该小时。请查看我所做的更新,我希望这是您正在寻找的。