字段类型的可能值的真实范围是什么?日期&#39 ;?

时间:2014-04-18 07:14:08

标签: mysql

日期字段类型有限制' 1000-01-01' - ' 9999-12-31'

但为什么插入' 987-10-10'不是' 1000-01-01' ?

  mysql> INSERT INTO DATE12(datas) VALUES('987-10-10');
    Query OK, 1 row affected (0.03 sec)

    mysql> SELECT * FROM DATE12;
    +------+------------+
    | id   | datas      |
    +------+------------+
    | NULL | 1987-11-04 |
    | NULL | 0987-10-10 |
    +------+------------+
    2 rows in set (0.00 sec)

数据格式不正确

 mysql> INSERT INTO DATE12(datas) VALUES('10001-13-12');
    Query OK, 1 row affected, 1 warning (0.03 sec)

    mysql> SELECT * FROM DATE12;
    +------+------------+
    | id   | datas      |
    +------+------------+
    | NULL | 1987-11-04 |
    | NULL | 0987-10-10 |
    | NULL | 0000-00-00 |

但对于时间类型所有好

mysql> INSERT INTO time1(t) VALUE('-1112:45:12');
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> SELECT * FROM time1;
+------+------------+
| id   | t          |
+------+------------+
| NULL | NULL       |
| NULL | -12:45:12  |
| NULL | -838:59:59 |
+------+------------+
3 rows in set (0.00 sec)

mysql> INSERT INTO time1(t) VALUE('11112:45:12');
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> SELECT * FROM time1;
+------+------------+
| id   | t          |
+------+------------+
| NULL | NULL       |
| NULL | -12:45:12  |
| NULL | -838:59:59 |
| NULL | 838:59:59  |
+------+------------+
4 rows in set (0.00 sec)

mysql>

1 个答案:

答案 0 :(得分:2)

  

...为什么要加入内脏' 987-10-10'不是' 1000-01-01' ?

根据The DATE, DATETIME, and TIMESTAMP Types

的文件
  

对于DATEDATETIME范围说明,“支持”表示尽管早期值可能有效,但无法保证。

意思是,'1000-01-01'之前的日期也可以被接受,但不能保证 因此,在您的情况下,日期条目'987-10-10'被接受,没有错误。

您声称未插入'1000-01-01'。但你实际上试过了'10001-13-12' 即使您尝试使用'1000-13-12',它也会失败,因为'13'部分的值'month'意味着更少。

根据Date and Time Literals

的文件
  

作为'YYYYMMDD''YYMMDD'中没有分隔符的字符串格式,只要字符串作为日期有意义。例如,'20070523''070523'被解释为'2007-05-23',但'071332'是非法的(它具有无意义的月和日部分)并变为'0000-00-00'

虽然在文档中没有看到,但上述声明对'YYYY-MM-DD'等格式也有效。以下示例中显示了相同的内容:

mysql> insert into vdt(dt) values( '1001-13-32' );
ERROR 1292 (22007): Incorrect date value: '1001-13-32' for column 'dt' at row 1

mysql> select date_format( '2013-13-32', '%Y-%m-%d' ); show warnings;
+-----------------------------------------+
| date_format( '2013-13-32', '%Y-%m-%d' ) |
+-----------------------------------------+
| NULL                                    |
+-----------------------------------------+
1 row in set, 1 warning (0.00 sec)

+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '2013-13-32' |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> select str_to_date( '20131232', '%Y%m%d' ); show warnings;
+-------------------------------------+
| str_to_date( '20131232', '%Y%m%d' ) |
+-------------------------------------+
| NULL                                |
+-------------------------------------+
1 row in set, 1 warning (0.00 sec)

+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '20131232' for function str_to_date |
+---------+------+---------------------------------------------------------------+