【问题标题】:SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2008-03-30 02:56:12'SQLSTATE [22007]:无效的日期时间格式:1292 不正确的日期时间值:'2008-03-30 02:56:12'
【发布时间】:2016-05-13 07:31:52
【问题描述】:

系统 本地 PHP 5.6.19 使用 Laravel 5.0 制作的应用,使用 fzaninotto/Faker 作为播种器 mysql远程

远程 MySQL Debian 8 与 MariaDB 10.1.13-MariaDB-1~jessie

运行播种机

php artisan migrate:reset; php artisan migrate; php artisan db:seed

在seeder添加不定用户数后(每次重现的错误都不一样)得到错误:

[Illuminate\Database\QueryException]
  SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2008-03-30 02:56:12' for column 'created_at' at row 1 (S
  QL: insert into `users` (`type`, `name`, `email`, `nick`, `password`, `vat`, `address`, `zipcode`, `city`, `state`, `country`, `cr
  eated_at`, `updated_at`) values (customer, Adrian Santos, qpuig@live.com, rzavala12, y$Veqd2mkgRHtl6VKtYBV0yey77tVLo34.6THXqhtGRwg
  /Ea73/FhlK, 02058805Y, Plaça Abril, 85, 96º D, 44824, Vargas de San Pedro, 57431, San Roig, Huesca, ES, 2008-03-30 02:56:12, 2008-
  03-30 02:56:12))

嗯.. 日期时间是 2008-03-30 02:56:12

在出现错误之前使用播种器创建的最新 3 个用户的示例:

INSERT INTO `users` (`id`,`type`,`email`,`nick`,`password`,`name`,`vat`,`address`,`zipcode`,`city`,`state`,`country`,`totals`,`remember_token`,`created_at`,`updated_at`) VALUES (15053,'buyer','asauceda@live.com','celia657','$2y$10$P4SOJOAQHsC8W7ctJ5v1F.8loccYzjAW95ILwWZ1RzObNs01hKjr2','Bruno Aguado','71514876X','Paseo Corral, 1, Entre suelo 0º, 63362, La Saiz','58061','Navarrete de Ulla','Cádiz','ES',NULL,NULL,'2012-09-13 06:01:51','2012-09-13 06:01:51');
INSERT INTO `users` (`id`,`type`,`email`,`nick`,`password`,`name`,`vat`,`address`,`zipcode`,`city`,`state`,`country`,`totals`,`remember_token`,`created_at`,`updated_at`) VALUES (15052,'buyer','ana.serna@live.com','cristian126','$2y$10$fe2Hdh4p0bttNfo9uzwSe.L5OOzPwsm5p8g5.YhW5PAoxKcSObDta','Enrique Rivero','06604287K','Ronda Saul, 321, 8º C, 76264, San Álvarez de Arriba','11402','El Roybal Baja','Zamora','ES',NULL,NULL,'2007-11-14 16:39:41','2007-11-14 16:39:41');
INSERT INTO `users` (`id`,`type`,`email`,`nick`,`password`,`name`,`vat`,`address`,`zipcode`,`city`,`state`,`country`,`totals`,`remember_token`,`created_at`,`updated_at`) VALUES (15051,'buyer','iluna@terra.com','aalmanza21','$2y$10$EA.NhWHuT8.nGoZjD18hqOKatHH3MbboY2DjZywlceH8K60spAe5m','Miriam Riojas','24055470T','Calle Soriano, 0, 75º A, 29744, L\' Montenegro','12236','As Martínez','Illes Balears','ES',NULL,NULL,'2013-03-25 23:15:50','2013-03-25 23:15:50');
INSERT INTO `users` (`id`,`type`,`email`,`nick`,`password`,`name`,`vat`,`address`,`zipcode`,`city`,`state`,`country`,`totals`,`remember_token`,`created_at`,`updated_at`) VALUES (15050,'buyer','qsalgado@hotmail.com','mateo26','$2y$10$6.lFRsqEjXb1kdZOhAX7Cu1Xecgu1ZvAkhaADKcfSpEi6ODQM9nRK','Alonso Núñez','50161945A','Camino Ainara, 78, 65º A, 17155, L\' Ayala del Pozo','47226','Román de las Torres','Las Palmas','ES',NULL,NULL,'2016-05-12 11:00:01','2016-05-12 11:00:01');

阅读一些信息,例如MYSQL incorrect DATETIME formatHow to make sql-mode=“NO_ENGINE_SUBSTITUTION” permanent in MySQL my.cnf,并验证这个问题的mysql变量。

MariaDB [(none)]> select @@GLOBAL.sql_mode;
--------------
select @@GLOBAL.sql_mode
--------------

+------------------------+
| @@GLOBAL.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
MariaDB [(none)]> select @@SESSION.sql_mode;
--------------
select @@SESSION.sql_mode
--------------

+------------------------+
| @@SESSION.sql_mode     |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

【问题讨论】:

    标签: mysql datetime laravel-5 mariadb faker


    【解决方案1】:

    问题很简单。这是关于“夏令时”的问题

    通过查询Daylight Saving Time Spain 的表格,该日期确实是 2011 年 3 月 27 日下午 2:00。因此,任何日期都是包含时间的日期,在 02:00 到 02:59 之间将失败,因为时钟从 02:00 向前移动到 02:59。

    【讨论】:

    • 列(created_atupdated_at)是 TIMESTAMP 类型的吗?对于 DATETIME 数据类型,这不会发生。
    • @wchiquito 这不是问题。质疑它是 USE DATETIME.Apreciate 你的 cmets。此外,如果仔细阅读,列具有 dattime 格式。错误显示。是的,发生了。阅读我的解决方案,并尝试相同的插入。,以重现问题。
    • 我无法重现数据类型 DATETIME 的问题。 TIMESTAMP 发生预期错误。
    • TIMESTAMP 存储为 UTC。从“02:56”转换每年一小时是不可能的,因此TIMESTAMP 似乎失败了。实际上,这是“错误输入”,因为“02:56”不存在,就像“Feb 29”在大多数年份都不存在一样。此外,闰秒可能会造成麻烦。
    • 起初我无法完全理解所提供的答案,但@abkrim 是正确的。总而言之,Faker 没有考虑夏令时,因此它可能会提供可能不存在的时间。例如,2016 年,在美国,夏令时从 3 月 13 日开始,所以凌晨 2 点,时钟移到了凌晨 3 点。因此,“2016-03-13 02:01:00”到“2016-03-13 02:59:00”是无效的时间戳,因为时间不存在。
    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    相关资源
    最近更新 更多