sql - 添加时间间隔,跳过某段时间

ts.*_*ts. 5 mysql sql time datetime stored-procedures

我有一个mySql查询,它会在datetime字段中添加一定的时间间隔.

UPDATE table T 
   SET T.ending = DATE_ADD(T.ending, INTERVAL T.hours * 3600 * some_other_variable_factors SECONDS)) 
Run Code Online (Sandbox Code Playgroud)

现在,我需要检测新的结束时间是否在几个小时之间(比如20:00到06:00),这应该从计算中排除.

IE浏览器.如果旧的结局是今天,19:58,我们正在增加4分钟,新的结局应该是明天,06:02

额外的困难是添加的时间可能超过24小时.因此,如果旧结尾是今天,19.00,我们正在增加24小时,新结尾应该是后天,15.00(这听起来像一部非常糟糕的电影的标题;)

有没有办法在mysql中实现这一点?在一个查询?我也在考虑存储过程,但我没有任何经验.

一些测试数据:

   CREATE TABLE IF NOT EXISTS `tt` (
      `source` datetime NOT NULL,
      `hours` int(11) NOT NULL,
      `off_start` int(11) NOT NULL,
      `off_long` int(11) NOT NULL,
      `correct` datetime NOT NULL    
    ) ENGINE=InnoDb;


    INSERT INTO `tt` (`source`, `hours`, `off_start`, `off_long`, `correct`) VALUES
    ('2010-11-11 12:00:00', 1, 20, 10, '2010-11-11 13:00:00'),
    ('2010-11-11 19:00:00', 1, 20, 10, '2010-11-12 06:00:00'),
    ('2010-11-11 19:00:00', 2, 20, 10, '2010-11-12 07:00:00'),
    ('2010-11-11 19:00:00', 3, 20, 10, '2010-11-12 08:00:00'),
    ('2010-11-11 19:00:00', 24, 20, 10, '2010-11-13 15:00:00'),
    ('2010-11-11 19:00:00', 48, 20, 10, '2010-11-15 11:00:00'),
    ('2010-11-11 19:00:00', 72, 20, 10, '2010-11-17 07:00:00');
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 3

SELECT  CASE
        WHEN HOUR((t_ending + INTERVAL some_other_variable_factors HOUR)  - INTERVAL 20 HOUR) < 10 THEN
                t_ending + INTERVAL some_other_variable_factors HOUR + INTERVAL 10 HOUR
        ELSE
                t_ending + INTERVAL some_other_variable_factors HOUR
        END
FROM    mytable
Run Code Online (Sandbox Code Playgroud)

INTERVAL 20 HOUR表示您的休息时间从 开始20:00INTERVAL 10 HOUR表示持续 10 小时(20:00直到06:00)。相应地进行调整。

更新:

SET @hours = 54;

SELECT  CAST('2010-01-01 15:00:00' + INTERVAL @hours HOUR AS DATETIME);

--
2010-01-03 21:00:00


SELECT  CASE
        WHEN HOUR(CAST('2010-01-01 15:00:00' + INTERVAL @hours HOUR AS DATETIME)  - INTERVAL 20 HOUR) < 10 THEN
                CAST('2010-01-01 15:00:00' + INTERVAL @hours HOUR + INTERVAL 10 HOUR AS DATETIME)
        ELSE
                CAST('2010-01-01 15:00:00' + INTERVAL @hours HOUR AS DATETIME)
        END;

--
2010-01-04 07:00:00
Run Code Online (Sandbox Code Playgroud)