【问题标题】:How to calculate hour of time range with SQL Query (MySQL)如何使用 SQL Query (MySQL) 计算时间范围的小时数
【发布时间】:2014-02-11 08:31:44
【问题描述】:

有没有办法用 SQL Query 计算时间范围的小时数。

接受时间为 08.00 - 12.00 和 13.00-16.00

我有 2 列 start_timeend_timetime_table

问题 1

开始时间 = 08:00:00

end_time = '12:00:00'

时间范围的小时 = 08.00 - 12.00 的 4 小时

问题 2

start_time = '07:00:00'

end_time = '10:00:00'

时间范围的小时 = 08.00 - 10.00 的 2 小时

问题 3

start_time = '10:00:00'

end_time = '17:00:00'

时间范围 = 10.00 - 12.00 和 13.00 - 16.00 之间的 5 小时

谢谢你,谢里夫

【问题讨论】:

  • 如果您可以更改表架构,请考虑将start_timeend_time 转换为DATETIME or TIMESTAMP,然后您可以使用任意数量的内置日期时间函数,例如TIMEDIFF.
  • 现在用TIME不行吗?
  • 我看不出日期/时间函数有什么优势。这是一个简单的数轴。
  • @Strawberry 您如何建议在没有字符串操作的情况下使用算术运算对08:00:0012:00:00 进行差异计算?当然,既然我们知道 OP 的架构使用 TIME,我的评论就无效了。
  • 例子是TIME类型。

标签: mysql


【解决方案1】:

start_time 和 end_time 都是整数,便于理解

SELECT id, SUM(hour) FROM (
    SELECT id, LEAST(12, end_time) - GREATEST(8, start_time) hour FROM `schedule` WHERE start_time<=12
    UNION
    SELECT id, LEAST(16, end_time) - GREATEST(13, start_time) hour FROM `schedule` WHERE end_time >=13
) x GROUP BY id

【讨论】:

  • 强在这一点上的力量是
  • 某行时间也有分钟
  • 您可以将 start_time 和 end_time 存储为时间戳格式或使用 UNIX_TIMESTAMP() 函数将 datetime 转换为时间戳,然后再进行比较
  • 知道了!非常感谢。
【解决方案2】:

你也可以使用 Timediff 函数。

喜欢 语法 timediff(end_time,start_time);

select timediff('12:00:00','08:00:00'); -- 04:00:00 select timediff('10:00:00','07:00:00'); -- 03:00:00 select timediff('17:00:00','10:00:00'); -- 07:00:00

如果您只想返回小时数,请键入 select HOUR(timediff('12:00:00','08:00:00')); -- 4 select HOUR(timediff('10:00:00','07:00:00')); -- 3 select HOUR(timediff('17:00:00','10:00:00')); -- 7

【讨论】:

  • SELECT HOUR(TIMEDIFF(end_time,start_time)) FROM time_table;
【解决方案3】:

试试这个

SELECT TIMEDIFF('your_time_in_col', 'your_time_out_col') FROM yourtable WHERE your_key = 'your_key_value'

【讨论】:

    【解决方案4】:

    考虑到最后一个问题……

    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,start_time INT NOT NULL
    ,end_time INT NOT NULL
    );
    
    
    INSERT INTO my_table (start_time,end_time) VALUES
    (8,12),(13,16),(10,17);
    
     SELECT * FROM my_table;
     +----+------------+----------+
     | id | start_time | end_time |
     +----+------------+----------+
     |  1 |          8 |       12 |
     |  2 |         13 |       16 |
     |  3 |         10 |       17 |
     +----+------------+----------+
    
                              3
            <----------------------------------->
            | 1        |   |       2       |
    <------------------>   <--------------->
    8   9   10   11   12   13   14   15   16   17
    
    SELECT SUM(LEAST(x.end_time,y.end_time - GREATEST(x.start_time,y.start_time) )) diff
      FROM my_table x
      JOIN my_table y 
        ON x.id <> y.id 
       AND x.end_time >= y.start_time 
       AND x.start_time < y.end_time 
     WHERE x.id = 3;
    
     +------+
     | diff |
     +------+
     |    5 |
     +------+ 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多