ALTER表和添加间隔

时间:2018-04-04 15:41:09

标签: mysql

我有一张包含以下数据和结构的表:

Date       Analyst      Start Time   Stop Time
4/2/2018   Bill Smith   7:00         10:00

我需要将开始时间和停止时间分解为30分钟。决赛桌应如下所示:

Date       Analyst      Start Time   Stop Time
4/2/2018   Bill Smith   7:00         7:30
4/2/2018   Bill Smith   7:30         8:00
4/2/2018   Bill Smith   8:00         8:30
4/2/2018   Bill Smith   8:30         9:00
4/2/2018   Bill Smith   9:00         9:30
4/2/2018   Bill Smith   9:30         10:00

有没有办法在查询中使用MySQL实现这一目标?

2 个答案:

答案 0 :(得分:0)

我为你做了这个存储过程,你唯一可以改进的就是将所有结果合并为一个(如果可能的话)。

CREATE PROCEDURE test()
BEGIN
DECLARE vFecIni DATETIME;
DECLARE vFecFin DATETIME;
SET vFecIni = CONCAT(DATE(NOW()),' ', '00:00:00');
SET vFecFin = CONCAT(DATE(NOW()),' ', '00:00:00') + INTERVAL 1 DAY;
    WHILE vFecIni < vFecFin DO
        SELECT vFecIni;
        SET vFecIni = vFecIni + INTERVAL 30 MINUTE;
    END WHILE;
END;

答案 1 :(得分:0)

正如其中一条评论所暗示的那样,这是一个相当广泛的主题,但是仍然有可能让你走上完成这项任务的道路,因为你听起来像是在迎接挑战。

将其细分为几个阶段。

首先,您需要一个表来处理(tableB),这将允许您编写新创建的时间段记录。这应该与现有表(tableA)的模式匹配。如果您尝试仅使用现有的tableA,那么写入第二个表比使用更新和插入的混合更复杂更简单,更安全。

其次,定义程序。在删除对cur2和IF b < c THEN ... END IF;块的所有引用后,documentation中示例游标的基本结构非常适合您的需要。

您应该遵循示例的确切结构,然后为tableA中的每个列声明变量。 cur1的声明应该选择tableA中的所有列。您需要在LOOP中处理游标返回的行,如示例所示,但为此您需要定义WHILE ... END WHILE块。如果你调用变量vDate,vAnalyst,vStartTime和vStopTime,那么WHILE块看起来像这样:

WHILE vStartTime < vStopTime DO
  INSERT INTO tableB (`date`,`analyst`,`startTime`,`stopTime`) 
    VALUES (vDate,vAnalyst,vStartTime, ADDTIME(vStartTime, '00:30:00'));
  SET vStartTime := ADDTIME(vStartTime, '00:30:00'); 
END WHILE;

调用该过程,您应该使用您需要的时间段记录填充tableB。

最后,当您对tableB中的定义和记录感到满意时,请删除tableA并将tableB重命名为tableA。