首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql -添加具有跳过特定期间的时间间隔。

sql -添加具有跳过特定期间的时间间隔。
EN

Stack Overflow用户
提问于 2010-11-11 11:05:45
回答 2查看 2K关注 0票数 5

我有一个mySql查询,它向datetime字段添加一定的时间间隔。

代码语言:javascript
复制
UPDATE table T 
   SET T.ending = DATE_ADD(T.ending, INTERVAL T.hours * 3600 * some_other_variable_factors SECONDS)) 

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

即。如果今天是旧结局,我们加4分钟,新的结局应该是明天06:02。

额外的困难是,增加的时间可以超过24小时。所以,如果旧的结局是今天,19点,我们增加了24小时,新的结局应该是后天,15点(这听起来是一个非常糟糕的电影的标题;)

在mysql中有实现这个目标的方法吗?在一个查询中?我也在考虑存储过程,但我没有任何经验。

一些测试数据:

代码语言:javascript
复制
   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');
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-11 11:13:39

代码语言:javascript
复制
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

INTERVAL 20 HOUR意味着你的休息时间从20:00开始,INTERVAL 10 HOUR意味着它持续10个小时(20:00直到06:00)。相应调整。

更新:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2010-11-18 11:11:15

这是我的:

代码语言:javascript
复制
CREATE PROCEDURE do_update()
BEGIN

DECLARE @offhoursperday, @hours, @days, @remaininghours INT
DECLARE @offhoursstart, @offhoursend TIME

SET @offhoursstart = CAST('22:00' AS TIME)
SET @offhoursend = CAST('06:00' AS TIME)
SET @hours = 54
SET @days = @hours / (24 - @offhoursperday)
SET @remaininghours = @hours % (24 - @offhoursperday)

UPDATE table T 
   SET T.ending =  
   CASE 
       WHEN ((HOUR(TIMEDIFF(@offhoursstart, TIME(T.ending))) + 24) % 24) < @remaininghours
       THEN DATE_ADD(DATE_ADD(T.ending, INTERVAL @days DAY), INTERVAL @remaininghours HOUR)
       ELSE DATE_ADD(DATE_ADD(T.ending, INTERVAL @days DAY), INTERVAL (@remaininghours + @offhoursperday) HOUR)
   END

END
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4153733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档