我有一张包含以下数据和结构的表:
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实现这一目标?
答案 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。