Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 填写';间隙行';使用sql过程_Mysql_Sql_Stored Procedures - Fatal编程技术网

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秒的事务处理之外,还没有取得太大进展。抱歉误导了你。