MySQL将DATETIME字段00:00:00.000000转换为DATE

时间:2016-06-03 19:21:20

标签: mysql date datetime

我有一张桌子:

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

4 个答案:

答案 0 :(得分:2)

我找到了解决方案!

步骤:

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而不是00:00:00。

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

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

答案 1 :(得分:0)

如果您没有值,则应使用null。那么为什么不先更新表然后更改表结构呢?

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

答案 2 :(得分:0)

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

以下是您可以执行此操作的摘录:

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

答案 3 :(得分:0)

Date() function

food

似乎有a bug in mysql迫使我们将日期分配给日期,如果它为空。所以,最终的答案是:

<%= @foods.each do |food| %>
  <%= @food[menu] %>
<% end %>

希望它有所帮助。