【发布时间】:2019-08-06 18:29:56
【问题描述】:
我目前正在计算一个日期时间列与另一个日期时间列的滞后变量之间的时间差,该列来自一个较小的表。 然后将结果插入到更大的最终表中。 这是一个过程的一部分,我有几个较小的表作为 csv,对于每个表,必须计算滞后差异并将其加载到最终表中(最终表大约为 20GB,12 个较小的表每个大约为 2.5GB )
我之前已经做了几次没有滞后变量的单独插入,一切都很好。 然而,在 12 的表 6 中,我现在得到以下错误,我不知道为什么:
ERROR 1292 (22007): Truncated incorrect time value: '2355:46:39.000000'
我可以提供一个适用于其余表格的测试示例:
DROP TABLE IF EXISTS single_test;
CREATE TABLE single_test(
medallion VARCHAR(64),
hack_license VARCHAR(64),
pickup_datetime DATETIME,
dropoff_datetime DATETIME,
id INT NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO single_test VALUES
('a', '1' , '2013-01-06 00:18:35','2013-01-06 02:10:33',1),
('a', '1' , '2013-01-06 02:40:58','2013-01-06 03:40:01',2),
('b', '1' , '2013-01-06 04:07:21','2013-01-06 05:00:41',3),
('c', '1' , '2013-01-07 13:12:08','2013-01-07 13:32:27',4),
('a', '2', '2013-01-06 03:50:30','2013-01-06 04:22:13',5),
('a', '2', '2013-01-06 04:41:23','2013-01-06 04:57:04',6),
('d', '2', '2013-01-07 12:22:56','2013-01-07 13:02:14',7),
('d', '3', '2013-01-07 13:03:24','2013-01-07 15:47:31',8)
;
CREATE TABLE final_test(
medallion VARCHAR(64),
hack_license VARCHAR(64),
pickup_datetime DATETIME,
dropoff_datetime DATETIME,
id INT NOT NULL,
delta VARCHAR(20),
current_dropoff DATETIME,
current_hack VARCHAR(64),
PRIMARY KEY (id)
);
SET @quot= '000-00-00 19:19:19';
SET @current_hack = '';
INSERT INTO final_test
SELECT medallion, hack_license, pickup_datetime, dropoff_datetime, id,
IF(@current_hack = hack_license,TIMEDIFF(pickup_datetime, @quot),NULL) as delta,
@quot:= dropoff_datetime current_dropoff, @current_hack:= hack_license
FROM single_test ORDER BY hack_license, pickup_datetime;
结果如下所示:
SELECT * FROM final_test;
+-----------+--------------+---------------------+---------------------+----+-----------------+---------------------+--------------+
| medallion | hack_license | pickup_datetime | dropoff_datetime | id | delta | current_dropoff | current_hack |
+-----------+--------------+---------------------+---------------------+----+-----------------+---------------------+--------------+
| a | 1 | 2013-01-06 00:18:35 | 2013-01-06 02:10:33 | 1 | NULL | 2013-01-06 02:10:33 | 1 |
| a | 1 | 2013-01-06 02:40:58 | 2013-01-06 03:40:01 | 2 | 00:30:25.000000 | 2013-01-06 03:40:01 | 1 |
| b | 1 | 2013-01-06 04:07:21 | 2013-01-06 05:00:41 | 3 | 00:27:20.000000 | 2013-01-06 05:00:41 | 1 |
| c | 1 | 2013-01-07 13:12:08 | 2013-01-07 13:32:27 | 4 | 32:11:27.000000 | 2013-01-07 13:32:27 | 1 |
| a | 2 | 2013-01-06 03:50:30 | 2013-01-06 04:22:13 | 5 | NULL | 2013-01-06 04:22:13 | 2 |
| a | 2 | 2013-01-06 04:41:23 | 2013-01-06 04:57:04 | 6 | 00:19:10.000000 | 2013-01-06 04:57:04 | 2 |
| d | 2 | 2013-01-07 12:22:56 | 2013-01-07 13:02:14 | 7 | 31:25:52.000000 | 2013-01-07 13:02:14 | 2 |
| d | 3 | 2013-01-07 13:03:24 | 2013-01-07 15:47:31 | 8 | NULL | 2013-01-07 15:47:31 | 3 |
+-----------+--------------+---------------------+---------------------+----+-----------------+---------------------+--------------+
8 rows in set (0,00 sec)
相比之下,错误消息没有多大意义,因为我希望 TIMEDIFF 截断任何无效输入:
# Extremely Large difference
SELECT TIMEDIFF("2013-01-01 19:00:00","1900-01-01 19:00:00");
+-------------------------------------------------------+
| TIMEDIFF("2013-01-01 19:00:00","1900-01-01 19:00:00") |
+-------------------------------------------------------+
| 838:59:59 |
+-------------------------------------------------------+
1 row in set, 1 warning (0,00 sec)
# Invalid/ unrealistic datetime format due to to high/ to low values
SELECT TIMEDIFF("2013-01-01 19:00:00","000-00-00 19:19:19");
+------------------------------------------------------+
| TIMEDIFF("2013-01-01 19:00:00","000-00-00 19:19:19") |
+------------------------------------------------------+
| 838:59:59 |
+------------------------------------------------------+
1 row in set, 1 warning (0,00 sec)
# Invalid/ unrealistic datetime format due to character in values
SELECT TIMEDIFF("2013-01-01 19:00:00","000-00-00T 19:19:19");
+-------------------------------------------------------+
| TIMEDIFF("2013-01-01 19:00:00","000-00-00T 19:19:19") |
+-------------------------------------------------------+
| NULL |
+-------------------------------------------------------+
1 row in set, 1 warning (0,00 sec)
我正在使用 Mysql 5.7。
我还在较小的数据中搜索了字母表中的无效字符,但一无所获。
最好的问候
PS:我知道这个 SO 线程,但它没有提供任何帮助 Error Code: 1292. Truncated incorrect time value
【问题讨论】:
-
如何重现该问题?您的代码works on db-fiddle。请发布
select @@sql_mode;的结果 -
这是一个更简短的可重现示例:db-fiddle.com/f/6UP4Za8wvaVB9JcTCS6F4t/0
-
恕我直言,这个错误是有道理的。对我来说没有意义的是它是在插入语句上抛出的,而不是在选择语句上。
-
太棒了!这也是我的问题:为什么我会收到一个错误,它会中断我的插入查询而不是截断值。您的回答并没有解决问题,而是缩小了问题范围并提供了一个可重复的示例!也许您或我应该根据您在另一个线程中的小提琴发布更精确的问题
-
select @@sql_mode;的结果@ ` | @@sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | `