MySQL数据类型 DATETIME和 DATE

来源:互联网 发布:mac下可以做java开发吗 编辑:程序博客网 时间:2024/05/29 14:57
DATETIME占用8字节,是占用空间最多的一种日期类型。它既显示了日期,同时也显示了时间。
其可以表达的日期范围为“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。
DATE占用3字节,可显示的日期范围为“1000-01-01”到“9999-12-31”。
在MySQL数据库中,对日期和时间输入格式的要求是非常宽松的,以下的输入都可以视为日期类型。
 2011-01-01 00:01:10
 2011/01/01 00+01+10
 20110101000110
 11/01/01 00@01@10
其中,最后一种类型中的“11”有些模棱两可,MySQL数据库将其视为2011还是1911呢?下面来做个测试:
mysql> SELECT CAST('11/01/01 00@01@10' AS DATETIME) AS datetime\G;
*************************** 1. row ***************************
datetime: 2011-01-01 00:01:10
1 row in set (0.00 sec)

可以看到数据库将其视为离现在最近的一个年份。

这种写法11/01/01 00@01@10可能不是一个非常好的习惯。如果没有特别的条件和要求,

还是在输入时按照标准的“YYYY-MM-DD HH:MM:SS”格式来进行。

在MySQL 5.5版本之前(包括5.5版本),数据库的日期类型不能精确到微秒级别,任何的微秒数值都会被数据库截断,
例如:
mysql> CREATE TABLE t ( a DATETIME );
Query OK, 0 rows affected (0.25 sec)

mysql> INSERT INTO t SELECT '2011-01-01 00:01:10.123456';
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t\G;
*************************** 1. row ***************************
a: 2011-01-01 00:01:10
1 row in set (0.00 sec)

不过MySQL数据库提供了函数MICROSECOND来提取日期中的微秒值,示例如下:
mysql> SELECT MICROSECOND('2011-01-01 00:01:10.123456')\G;
*************************** 1. row ***************************
MICROSECOND('2011-01-01 00:01:10.123456'): 123456
1 row in set (0.00 sec)


有意思的是, MySQL的CAST函数在强制转换到DATETIME时会保留到微秒数,不过在插入后同样会截断,示例如下:
mysql> SELECT CAST('2011-02-01 00:01:10.123456' AS DATETIME) D\G;
*************************** 1. row ***************************
D: 2011-02-01 00:01:10.123456
1 row in set (0.00 sec)

mysql> INSERT INTO t
 ->SELECT CAST('2011-02-01 00:01:10.123456' AS DATETIME);
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t\G;
*************************** 1. row ***************************
a: 2011-01-01 00:01:10
*************************** 2. row ***************************
a: 2011-02-01 00:01:10
2 rows in set (0.00 sec)

然而从MySQL 5.6.4版本开始,MySQL增加了对秒的小数部分(fractional second)的支持,具体语法为:
type_name(fsp)
其中,type_name的类型可以是TIME、DATETIME和TIMESTAMP。fsp表示支持秒的小数部分的精度,最大为6,表示微秒(microseconds);
默认为0,表示没有小数部分,同时也是为了兼容之前版本中的TIME、DATETIME和TIMESTAMP类型。
对于时间函数,如CURTIME()、SYSDATE()和UTC_TIMESTAMP()也增加了对fsp的支持,例如:
mysql> SELECT CURTIME(4) AS TIME\G;
*************************** 1. row ***************************
TIME: 10:22:37.4456

1 rows in set (0.00 sec)


原文链接:点击打开链接




1 0
原创粉丝点击