Mysql 填写';间隙行';使用sql过程
我有一个带有小时值的表,类似于:Mysql 填写';间隙行';使用sql过程,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我有一个带有小时值的表,类似于: |ID |Date |Value | |1 |2016-1-1 01:00 |12 | |2 |2016-1-1 02:00 |23 | |3 |2016-1-1 03:00 |45 | <-- Notice gap of 3 hours |4 |2016-1-1 06:00 |12 | |5 |2016-1-1 07:00 |3 | | ID | Date |值| |1 |
|ID |Date |Value |
|1 |2016-1-1 01:00 |12 |
|2 |2016-1-1 02:00 |23 |
|3 |2016-1-1 03:00 |45 | <-- Notice gap of 3 hours
|4 |2016-1-1 06:00 |12 |
|5 |2016-1-1 07:00 |3 |
| ID | Date |值|
|1 |2016-1-1 01:00 |12 |
|2 |2016-1-1 02:00 |23 |
|3 | 2016-1-103:00 | 45 |
- 我们将创建一个示例表来存储小时数据/值
- 然后我们将在调用时创建一个过程,该过程检查
表中显示了已完成小时数的数据
[最后完成的小时是指如果
当前时间为2016-02-12 13:10:53,则最后完成的时间为
考虑“2016-02-12 12:00:00”。]
- 如果表中有上一个完整小时的数据,则
程序与那一小时无关。否则程序会失败
插入最后一个完整小时的行,如下所示:
(日期、价值)(“2016-02-12 12:00:00”,0)
下面是实现:
表格:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
存储过程:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
事件:
接下来,我们将创建一个事件,它将在每小时的第五分钟触发此过程调用
CREATE EVENT `HourlyProcedureCallEvent`
ON SCHEDULE EVERY 1 HOUR STARTS '2016-02-12 13:05:00'
ON COMPLETION PRESERVE
ENABLE
DO
CALL HourlyProcedure();
注意:您必须在MySQL服务器的
上安装事件调度程序
。
下面是要在
上设置事件调度程序
的查询
SET GLOBAL event_scheduler=ON代码>
进一步说明:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
只关心最后一个小时的数据更容易处理。
但是,如果您真的想用存储过程来填补多个空白,那么下面的过程可能很方便
delimiter //
CREATE PROCEDURE `MultipleGapFillerProcedure`(start INT,end INT)
BEGIN
DECLARE my_value INT DEFAULT -1;
label1 :
WHILE start <= end DO
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL start HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL start HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
SET my_value = -1;
SET start = start + 1;
END WHILE label1;
END//
分隔符//
创建过程“MultipleGapFillerProcedure”(起始整型,结束整型)
开始
声明my_value INT DEFAULT-1;
标签1:
启动时
- 我们将创建一个示例表来存储小时数据/值
- 然后我们将在调用时创建一个过程,该过程检查
表中显示了已完成小时数的数据
[最后完成的小时是指如果
当前时间为2016-02-12 13:10:53,则最后完成的时间为
考虑“2016-02-12 12:00:00”。]
- 如果表中有上一个完整小时的数据,则
程序与那一小时无关。否则程序会失败
插入最后一个完整小时的行,如下所示:
(日期、价值)(“2016-02-12 12:00:00”,0)
下面是实现:
表格:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
存储过程:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
事件:
接下来,我们将创建一个事件,它将在每小时的第五分钟触发此过程调用
CREATE EVENT `HourlyProcedureCallEvent`
ON SCHEDULE EVERY 1 HOUR STARTS '2016-02-12 13:05:00'
ON COMPLETION PRESERVE
ENABLE
DO
CALL HourlyProcedure();
注意:您必须在MySQL服务器的
上安装事件调度程序
。
下面是要在
上设置事件调度程序
的查询
SET GLOBAL event_scheduler=ON代码>
进一步说明:
CREATE TABLE `hourlyTable` (
`ID` int(11) NOT NULL AUTO_INCREMENT ,
`Date` datetime NULL DEFAULT NULL ,
`value` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);
delimiter //
CREATE PROCEDURE `HourlyProcedure`()
BEGIN
DECLARE my_value INT DEFAULT -1;
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
END//
只关心最后一个小时的数据更容易处理。
但是,如果您真的想用存储过程来填补多个空白,那么下面的过程可能很方便
delimiter //
CREATE PROCEDURE `MultipleGapFillerProcedure`(start INT,end INT)
BEGIN
DECLARE my_value INT DEFAULT -1;
label1 :
WHILE start <= end DO
select `value` INTO my_value FROM hourlytable WHERE `Date` = DATE_FORMAT(NOW() - INTERVAL start HOUR,"%Y-%m-%d %H:00:00");
IF my_value = -1 THEN
INSERT INTO hourlytable
SET `Date` = DATE_FORMAT(NOW() - INTERVAL start HOUR,"%Y-%m-%d %H:00:00"),
`value` = 0;
END IF;
SET my_value = -1;
SET start = start + 1;
END WHILE label1;
END//
分隔符//
创建过程“MultipleGapFillerProcedure”(起始整型,结束整型)
开始
声明my_value INT DEFAULT-1;
标签1:
在启动时,为什么不将其留给应用程序级别?是否计划手动调用该过程?我想如果你喜欢每小时打一次电话,那会更容易处理。在这种情况下,您只需要关心最后一个完整小时的数据。为什么不将其留给应用程序级别?您是否计划手动调用该过程?我想如果你喜欢每小时打一次电话,那会更容易处理。在这种情况下,您只需要关心最后一个小时的数据。感谢您回答Subrata!尽管如此,我相信我问错了问题。我只需要在选择的结果中填充空白。(也就是说,我不需要数据保存在表中,我只需要填补结果集中的空白)我已经研究了一些类似的问题,并尝试用临时表左键连接,但除了40秒的事务处理之外,还没有取得太大进展。抱歉误导您。感谢您回答苏布拉塔!尽管如此,我相信我问错了问题。我只需要在选择的结果中填充空白。(也就是说,我不需要数据保存在表中,我只需要填补结果集中的空白)我已经研究了一些类似的问题,并尝试用临时表左键连接,但除了40秒的事务处理之外,还没有取得太大进展。抱歉误导了你。