我有一张桌子:
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
答案 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)
food
似乎有a bug in mysql迫使我们将日期分配给日期,如果它为空。所以,最终的答案是:
<%= @foods.each do |food| %>
<%= @food[menu] %>
<% end %>
希望它有所帮助。