Select MySQL 数据库 8.0.17 中行日期之间的差异

Select difference between row dates in MySQL database 8.0.17

我想计算同一 table 中不同行之间唯一日期字段的差异。

小样本。

给定以下查询 SELECT

SELECT
    sID,
    HHMMSS,
    FileName,
    TIMESTAMPDIFF( MINUTE, ( SELECT MAX( HHMMSS ) FROM `tbl_pds_timer` WHERE HHMMSS < t.HHMMSS ), HHMMSS ) AS min,
    TIMESTAMPDIFF( MINUTE, ( SELECT MAX( HHMMSS ) FROM `tbl_pds_timer` WHERE HHMMSS < t.HHMMSS ), HHMMSS )* 60 AS sec 
FROM
    `tbl_pds_timer` t ORDER BY sID DESC

+-----+---------------------+----------+-----+-------+
| sID | HHMMSS              | FileName | min | sec   |
+-----+---------------------+----------+-----+-------+
|  59 | 2021-03-02 06:43:06 | 20210228 |  12 |   720 |
|  58 | 2021-03-02 06:30:20 | 20210227 | 251 | 15060 |
|  57 | 2021-03-02 02:18:35 | 20210226 |  47 |  2820 |
|  56 | 2021-03-02 01:31:18 | 20210225 |  54 |  3240 |
|  55 | 2021-03-02 00:37:01 | 20210224 |  64 |  3840 |
|  54 | 2021-03-01 23:32:31 | 20210223 |  51 |  3060 |
|  53 | 2021-03-01 22:41:23 | 20210222 |  48 |  2880 |
|  52 | 2021-03-01 21:52:45 | 20210221 |  17 |  1020 |
|  51 | 2021-03-01 21:35:36 | 20210220 |  17 |  1020 |
|  50 | 2021-03-01 21:18:16 | 20210219 |  45 |  2700 |
+-----+---------------------+----------+-----+-------+
10 rows in set (0.04 sec)

我尝试使用以下查询更新 tbl_pds_timer table 上的字段 timer_mintimer_sec 但没有成功,因为更新影响的行为零。 .

UPDATE `tbl_pds_timer` AS k
JOIN (
    SELECT
        sID,
        HHMMSS,
        FileName,
        TIMESTAMPDIFF( MINUTE, ( SELECT MAX( HHMMSS ) FROM `tbl_pds_timer` WHERE HHMMSS < t.HHMMSS ), HHMMSS ) AS min,
        TIMESTAMPDIFF( MINUTE, ( SELECT MAX( HHMMSS ) FROM `tbl_pds_timer` WHERE HHMMSS < t.HHMMSS ), HHMMSS )* 60 AS sec 
    FROM
        `tbl_pds_timer` t 
    ) AS q 
    SET k.timer_min = q.min,
    k.timer_sec = q.sec;

Query OK, 0 rows affected (0.04 sec)
Rows matched: 59  Changed: 0  Warnings: 0

关于我将在 MySQL 中使用的日期函数的任何建议,或者是否有子选择可以执行此操作?

tbl_pds_timer 完成table 下面

-- ----------------------------
-- Table structure for tbl_pds_timer
-- ----------------------------
DROP TABLE IF EXISTS `tbl_pds_timer`;
CREATE TABLE `tbl_pds_timer`  (
  `FileName` varchar(255) DEFAULT NULL,
  `timer_min` varchar(255) DEFAULT NULL,
  `timer_sec` decimal(10, 2) NULL DEFAULT NULL,
  `HHMMSS` datetime(0) NULL DEFAULT NULL,
  `sID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`sID`) USING BTREE,
  UNIQUE INDEX `FileName`(`FileName`) USING BTREE
) ENGINE = MyISAM;

-- ----------------------------
-- Records of tbl_pds_timer
-- ----------------------------
INSERT INTO `tbl_pds_timer` VALUES ('20210101', NULL, NULL, '2021-02-28 19:46:08', 1);
INSERT INTO `tbl_pds_timer` VALUES ('20210102', NULL, NULL, '2021-02-28 19:58:14', 2);
INSERT INTO `tbl_pds_timer` VALUES ('20210103', NULL, NULL, '2021-02-28 20:11:10', 3);
INSERT INTO `tbl_pds_timer` VALUES ('20210104', NULL, NULL, '2021-02-28 21:11:19', 4);
INSERT INTO `tbl_pds_timer` VALUES ('20210105', NULL, NULL, '2021-02-28 22:43:17', 5);
INSERT INTO `tbl_pds_timer` VALUES ('20210106', NULL, NULL, '2021-02-28 23:31:07', 6);
INSERT INTO `tbl_pds_timer` VALUES ('20210107', NULL, NULL, '2021-03-01 00:02:41', 7);
INSERT INTO `tbl_pds_timer` VALUES ('20210108', NULL, NULL, '2021-03-01 00:16:40', 8);
INSERT INTO `tbl_pds_timer` VALUES ('20210109', NULL, NULL, '2021-03-01 00:28:46', 9);
INSERT INTO `tbl_pds_timer` VALUES ('20210110', NULL, NULL, '2021-03-01 00:41:16', 10);
INSERT INTO `tbl_pds_timer` VALUES ('20210111', NULL, NULL, '2021-03-01 01:00:39', 11);
INSERT INTO `tbl_pds_timer` VALUES ('20210112', NULL, NULL, '2021-03-01 01:23:54', 12);
INSERT INTO `tbl_pds_timer` VALUES ('20210113', NULL, NULL, '2021-03-01 01:41:52', 13);
INSERT INTO `tbl_pds_timer` VALUES ('20210114', NULL, NULL, '2021-03-01 02:06:37', 14);
INSERT INTO `tbl_pds_timer` VALUES ('20210115', NULL, NULL, '2021-03-01 02:26:49', 15);
INSERT INTO `tbl_pds_timer` VALUES ('20210116', NULL, NULL, '2021-03-01 02:39:00', 16);
INSERT INTO `tbl_pds_timer` VALUES ('20210117', NULL, NULL, '2021-03-01 02:50:55', 17);
INSERT INTO `tbl_pds_timer` VALUES ('20210118', NULL, NULL, '2021-03-01 03:18:14', 18);
INSERT INTO `tbl_pds_timer` VALUES ('20210119', NULL, NULL, '2021-03-01 03:40:22', 19);
INSERT INTO `tbl_pds_timer` VALUES ('20210120', NULL, NULL, '2021-03-01 03:58:19', 20);
INSERT INTO `tbl_pds_timer` VALUES ('20210121', NULL, NULL, '2021-03-01 04:14:01', 21);
INSERT INTO `tbl_pds_timer` VALUES ('20210122', NULL, NULL, '2021-03-01 04:40:22', 22);
INSERT INTO `tbl_pds_timer` VALUES ('20210123', NULL, NULL, '2021-03-01 05:10:23', 23);
INSERT INTO `tbl_pds_timer` VALUES ('20210124', NULL, NULL, '2021-03-01 05:30:37', 24);
INSERT INTO `tbl_pds_timer` VALUES ('20210125', NULL, NULL, '2021-03-01 06:02:43', 25);
INSERT INTO `tbl_pds_timer` VALUES ('20210126', NULL, NULL, '2021-03-01 06:49:15', 26);
INSERT INTO `tbl_pds_timer` VALUES ('20210127', NULL, NULL, '2021-03-01 07:20:08', 27);
INSERT INTO `tbl_pds_timer` VALUES ('20210128', NULL, NULL, '2021-03-01 07:49:21', 28);
INSERT INTO `tbl_pds_timer` VALUES ('20210129', NULL, NULL, '2021-03-01 08:21:58', 29);
INSERT INTO `tbl_pds_timer` VALUES ('20210130', NULL, NULL, '2021-03-01 08:36:03', 30);
INSERT INTO `tbl_pds_timer` VALUES ('20210131', NULL, NULL, '2021-03-01 08:49:58', 31);
INSERT INTO `tbl_pds_timer` VALUES ('20210201', NULL, NULL, '2021-03-01 09:20:30', 32);
INSERT INTO `tbl_pds_timer` VALUES ('20210202', NULL, NULL, '2021-03-01 09:53:16', 33);
INSERT INTO `tbl_pds_timer` VALUES ('20210203', NULL, NULL, '2021-03-01 10:37:21', 34);
INSERT INTO `tbl_pds_timer` VALUES ('20210204', NULL, NULL, '2021-03-01 11:32:05', 35);
INSERT INTO `tbl_pds_timer` VALUES ('20210205', NULL, NULL, '2021-03-01 12:06:37', 36);
INSERT INTO `tbl_pds_timer` VALUES ('20210206', NULL, NULL, '2021-03-01 12:19:50', 37);
INSERT INTO `tbl_pds_timer` VALUES ('20210207', NULL, NULL, '2021-03-01 12:32:58', 38);
INSERT INTO `tbl_pds_timer` VALUES ('20210208', NULL, NULL, '2021-03-01 13:10:33', 39);
INSERT INTO `tbl_pds_timer` VALUES ('20210209', NULL, NULL, '2021-03-01 13:57:31', 40);
INSERT INTO `tbl_pds_timer` VALUES ('20210210', NULL, NULL, '2021-03-01 14:48:57', 41);
INSERT INTO `tbl_pds_timer` VALUES ('20210211', NULL, NULL, '2021-03-01 15:21:01', 42);
INSERT INTO `tbl_pds_timer` VALUES ('20210212', NULL, NULL, '2021-03-01 15:50:30', 43);
INSERT INTO `tbl_pds_timer` VALUES ('20210213', NULL, NULL, '2021-03-01 16:37:51', 44);
INSERT INTO `tbl_pds_timer` VALUES ('20210214', NULL, NULL, '2021-03-01 17:21:09', 45);
INSERT INTO `tbl_pds_timer` VALUES ('20210215', NULL, NULL, '2021-03-01 18:09:29', 46);
INSERT INTO `tbl_pds_timer` VALUES ('20210216', NULL, NULL, '2021-03-01 18:55:31', 47);
INSERT INTO `tbl_pds_timer` VALUES ('20210217', NULL, NULL, '2021-03-01 19:42:30', 48);
INSERT INTO `tbl_pds_timer` VALUES ('20210218', NULL, NULL, '2021-03-01 20:32:32', 49);
INSERT INTO `tbl_pds_timer` VALUES ('20210219', NULL, NULL, '2021-03-01 21:18:16', 50);
INSERT INTO `tbl_pds_timer` VALUES ('20210220', NULL, NULL, '2021-03-01 21:35:36', 51);
INSERT INTO `tbl_pds_timer` VALUES ('20210221', NULL, NULL, '2021-03-01 21:52:45', 52);
INSERT INTO `tbl_pds_timer` VALUES ('20210222', NULL, NULL, '2021-03-01 22:41:23', 53);
INSERT INTO `tbl_pds_timer` VALUES ('20210223', NULL, NULL, '2021-03-01 23:32:31', 54);
INSERT INTO `tbl_pds_timer` VALUES ('20210224', NULL, NULL, '2021-03-02 00:37:01', 55);
INSERT INTO `tbl_pds_timer` VALUES ('20210225', NULL, NULL, '2021-03-02 01:31:18', 56);
INSERT INTO `tbl_pds_timer` VALUES ('20210226', NULL, NULL, '2021-03-02 02:18:35', 57);
INSERT INTO `tbl_pds_timer` VALUES ('20210227', NULL, NULL, '2021-03-02 06:30:20', 58);
INSERT INTO `tbl_pds_timer` VALUES ('20210228', NULL, NULL, '2021-03-02 06:43:06', 59);

更新

UPDATE `tbl_pds_timer` AS k
JOIN (
    SELECT
        sid,
        hhmmss,
        filename,
        TIMESTAMPDIFF( MINUTE, LAG( hhmmss ) OVER ( ORDER BY hhmmss ), hhmmss ) delta 
    FROM
        tbl_pds_timer 
    ORDER BY
        hhmmss 
    ) AS q 
    SET k.timer_min = q.delta

> Affected rows: 0
> Time: 0,003s
UPDATE tbl_pds_timer
JOIN ( SELECT sid, 
              hhmmss, 
              filename, 
              TIMESTAMPDIFF(MINUTE, LAG(hhmmss) OVER (ORDER BY hhmmss), hhmmss) timer_min,
              TIMESTAMPDIFF(SECOND, LAG(hhmmss) OVER (ORDER BY hhmmss), hhmmss) timer_sec
       FROM tbl_pds_timer) AS data_for_update USING (sid, hhmmss, filename)
SET tbl_pds_timer.timer_min = data_for_update.timer_min,
    tbl_pds_timer.timer_sec = data_for_update.timer_sec;

fiddle