【问题标题】:Strange MySQL warning 1264 for valid DateTime value有效日期时间值的奇怪 MySQL 警告 1264
【发布时间】:2012-07-28 16:46:17
【问题描述】:

我已经手动(GASP!)在命令行输入了一个 MySQL 命令,我收到了一个我什至无法理解的警告。 (在任何人说什么之前,是的,我知道:1. 使用命令行界面不是最好的方法;2. 我的表没有命名为“TABLE_NAME”,我的列没有命名为“DateColumn”,我的 RecordID 值不是真的是 "1234"; 3. 也许我的列类型应该是 TIMESTAMP,但现在不是。继续……)

尝试输入日期“2012 年 7 月 26 日下午 2:27 (GMT)”的值,我键入:

mysql> update TABLE_NAME set DateColumn="2012-07-26 14:27:00" where RecordID="1234";

我收到了:

Query OK, 1 row affected, 1 warning (0.11 sec) 
Rows matched: 1  Changed: 1  Warnings: 1

所以,我输入了:

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level   | Code | Message                                             |
+---------+------+-----------------------------------------------------+
| Warning | 1264 | Out of range value for column 'DateColumn' at row 1 |
+---------+------+-----------------------------------------------------+

很奇怪,我想。于是我先查表确认了列(字段)类型:

mysql> describe TABLE_NAME;

+------------+----------+------+-----+-------------------+-------+
| Field      | Type     | Null | Key | Default           | Extra |
| DateColumn | datetime | YES  |     | NULL              |       |
+------------+----------+------+-----+-------------------+-------+

但是值确实被正确写入数据库,并且没有被截断,AFAIK:

mysql> select * from TABLE_NAME where RecordID="1234";

+-----------------------------------------------+
| RecordID | Date_Column         | BlahBlahBlah |
+----------+---------------------+--------------+
|     1234 | 2012-07-26 14:27:00 | something..  | 
+----------+---------------------+--------------+

我已经在 StackOverflow.com 上搜索了解决方案。我已经用谷歌搜索了一个解释。我已经在http://dev.mysql.com/doc/refman/5.5/en/datetime.html 上读过,上面写着:

    MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. 

我什至有点怀疑这与我进入的日期或时间有关;所以我会说明数据库所在的服务器是太平洋夏令时间(GMT-8,除了现在 GMT-7 用于 DST);我从 EDT 上的客户端登录(SSH)(这无关紧要);我将所有 Date_Column 值存储为 GMT。在我输入值“2012-07-26 14:27:00”时,所有三个日期都在 2012 年 7 月 30 日之后。这并不重要——我应该能够输入未来日期而不会出错——但我认为这可能对您有所帮助。所以——

为什么,哦,为什么“2012-07-26 14:27:00”是一个超出范围的值?

我的 MySQL 客户端 API 版本是 5.1.49。

这是我第一次在 StackOverflow 上发帖。预先感谢您的建议。

【问题讨论】:

  • "支持的范围是 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。"所以我认为你的价值没有问题......
  • 你运行的是什么版本的 MySQL?
  • @Throdne mysql> 选择版本();版本() 5.1.56-日志
  • 我不是 100% 确定这是否正确,但您可能需要查看“str_to_date”mysql 命令。我昨晚正在寻找解决方案,但无法完成。让我知道“str_to_date”是否适合您。
  • @Throdne:Markus 建议的解决方案(如下)似乎有效,但您的解决方案也有效:mysql> update TABLE_NAME set DateColumn=STR_TO_DATE("2012-07-26 14:27:00", "%Y-%m-%d %H:%i:%s") where RecordID="1234";查询正常,1 行受影响(0.34 秒) 匹配行:1 更改:1 警告:0 但是请注意,我必须在 STR_TO_DATE 函数中指定参数的准确性(%H,而不是 %h 等)我在http://dev.mysql.com/...#function_get-format 找到了很多关于该项目的帮助。

标签: mysql datetime warnings mysql-error-1264


【解决方案1】:

我想知道它是否将它从字符串转换为某种日期格式。该日期格式将具有太多的精度,这将被截断。在分配之前尝试将其转换为日期时间。

【讨论】:

  • 谢谢,我会试试的。同时:警告没有说任何关于截断的内容,只是说该值“超出范围”。 (被难住了。)
  • 这行得通——没有警告! mysql> update TABLE_NAME set DateColumn=CAST("2012-07-26 14:27:00" AS DATETIME) where RecordID="1234";查询正常,1 行受影响(0.07 秒) 匹配行:1 更改:1 警告:0 我仍然不明白为什么它很重要,为什么“精度”不同。但是谢谢@Markus
猜你喜欢
  • 2023-04-02
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2013-02-21
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多