【问题标题】:MySQL convert DATETIME field 0000-00-00 00:00:00.000000 to DATEMySQL 将 DATETIME 字段 0000-00-00 00:00:00.000000 转换为 DATE
【发布时间】:2016-06-03 19:21:20
【问题描述】:

我有一张桌子:

mysql> describe sk_users;
+------------------------------+--------------+------+-----+---------+----------------+
| Field                        | Type         | Null | Key | Default | Extra          |
+------------------------------+--------------+------+-----+---------+----------------+
| name                         | varchar(255) | NO   |     | NULL    |                |
| dst_date                     | datetime(6)  | YES  |     | NULL    |                |
+------------------------------+--------------+------+-----+---------+----------------+

和数据:

mysql> select name, dst_date from sk_users;
+------+----------------------------+
| name | dst_date                   |
+------+----------------------------+
| a    | 2023-02-28 00:00:00.000000 |
| b    | 2016-06-01 00:00:00.000000 |
| c    | 0000-00-00 00:00:00.000000 |
+------+----------------------------+

我想将“dst_date”字段从日期时间转换为日期,当我尝试这样做时 - 出现错误:

mysql> ALTER TABLE `sk_users` CHANGE `dst_date` `dst_date` DATE NULL;
ERROR 1292 (22007): Incorrect date value: '0000-00-00 00:00:00' for column 'dst_date' at row 3

对不起,我不知道为什么我不能这样做。你能帮帮我吗?

感谢 juergen,我也尝试更新表以使用 NULL 值,但它也给了我一个错误:

ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'dst_date' at row 3

【问题讨论】:

  • 为什么不用null 而不是0000-00-00?首先更新表格 - 将所有这些日期设置为 null

标签: mysql date datetime


【解决方案1】:

我找到了解决办法!

步骤:

mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

你可以看到NO_ZERO_IN_DATE, NO_ZERO_DATE。我们需要暂时删除它。

mysql> SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

之后让我们更新我们的表以使用 NULL 代替 0000-00-00 00:00:00。

update 
  sk_users
set 
  dst_date = NULL
where
  dst_date LIKE '0000-00-00%';

然后我们可以再次注销/登录(恢复我们原来的sql_mode),它工作正常!

【讨论】:

    【解决方案2】:

    如果你没有值,你应该使用null。那么为什么不先更新表再改变表结构呢?

    update sk_users
    set dst_date = NULL
    where dst_date = '0000-00-00 00:00:00'
    

    【讨论】:

    • 我之前尝试过这样做:错误 1292 (22007):不正确的日期时间值:第 1 行的列 'dst_date' 的日期时间值不正确
    【解决方案3】:

    实际上,惯例是将我们没有的数据归零。因此,只需将其设置为 NULL,而是使用“0000-00-00”填充字段,您就可以更方便地更改表的结构。

    这里有一个 sn-p 方法:

    update 
      sk_users
    set 
      dst_date = NULL
    where
      dst_date = '0000-00-00 00:00:00';
    

    【讨论】:

      【解决方案4】:

      有一个Date() function:

      UPDATE sk_users set dst_date = date(dst_date);
      

      似乎a bug in mysql 强制我们为日期分配一个哨兵,如果它是空的。所以,最终的答案变成了:

      UPDATE sk_users set dst_date = now() where dst_date is null;UPDATE sk_users set dst_date = date(dst_date);
      

      希望对你有帮助。

      【讨论】:

      • mysql> 更新 sk_users 设置 dst_date = DATE(dst_date);错误 1292 (22007):不正确的日期时间值:第 3 行的列“dst_date”的“0000-00-00”
      • mysql> UPDATE sk_users set dst_date = today where dst_date is null;UPDATE sk_users set dst_date = date(dst_date);错误 1054 (42S22):“字段列表”中的“今天”列未知 错误 1292 (22007):日期时间值不正确:第 3 行的“dst_date”列的“0000-00-00”
      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2017-10-03
      • 2019-12-19
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多