mysql5.7官网直译数据类型--日期和时间类型2

11.3.4 YEAR(2) Limitations and Migrating to YEAR(4) 两位数字年限制和转移到4位数字年
因为两位数字的年将被移除而且在工作中用到比较少,所以不做翻译。
---------------------------------------------
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME
自动初始化和更新对时间戳和日期时间
TIMESTAMP和DATETIME列能够自动更新和初始化当前日期和时间(当然,时间戳也可以).
对于在表中的任何时间戳或者DATETIME列,你能设置当前时间戳为默认值,自动更新值或者两者都可以:
》当列没有设置值则可以自动初始化列设置当前时间戳值然后添加。
》一个自动更新列会自动更新当前时间戳当当前行的其他列值被改变时,修改当前值。一个自动更新列依然不会改变如果所有其他列被设置为他们的当前值。为了阻止在更新其他列的时候自动更新列值,可以专门设置它的值为目前的值。为了其他列都没有修改依然更新当前列的值,可以单独设置它应该有的值(例如,CURRENT_TIMESTAMP) .
另外,如果系统变量explicit_defaults_for_timestamp不可用,你能初始化或更新任何TIMESTAMP(但不是DATETIME)列为当前日期和时间通过设置其为NULL值,当然他已经被定义为 允许为null值。
为了设置自动化属性,使用DEFAULT CURRENT_TIMESTAMP和UPDATE CURRENT_TIMESTAMP在列的定义时。条件的顺序没有关系。如果两者都出现在一个列的定义中,不管谁在第一个,任何CURRENT_TIMESTAMP有相同的意义。这些是CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, and LOCALTIMESTAMP().
使用DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP来设置TIMESTAMP 和 DATETIME。DEFAULT条件也能够用于设置一个常量值(不是自动初始化);例如,默认是0或者默认是'2000-01-01 00:00:00'.
注意:
   下面的列子使用默认0,一个默认能够产生警告或者错误,的前提是是否严格SQL模式或者是NO_ZERO_DATE SQL模式可以用。你需要知道传统SQL模式包括严格模式和NO_ZERO_DATE.请看5.1.8部分的服务器的SQL模式。
TIMESTAMP 或者DATETIME列定义能够设置当前时间戳既是默认值又是自动更新值,或者是默认值不是自动更新值,或者两者都不是。不同列能够有不同的结合对自动化属性。下面的规则描述了所有的可能性:
》通过DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP,列会把当前时间戳作为它的默认值并且自动更新当前时间戳。
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
》使用一个DEFAULT条件但是没有ON UPDATE CURRENT_TIMESTAMP,列中给出默认值,但是不会自动更新当前时间戳。
默认值依赖于是否DEAULT设置条件为CURRENT_TIMESTAMP或者一个常量值。通过CURRENT_TIMESTAMP,默认值就是当前时间戳。
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP
);
对于常量值,默认值是被给出的值。在这种情况下,列完全没有自动初始化特性。
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0,
  dt DATETIME DEFAULT 0
);
》使用ON UPDATE CURRENT_TIMESTAMP 和一个常量默认条件, 列会自动初始化更新当前时间戳并且有一个给出的常量默认值。
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);
》使用了ON UPDATE CURRENT_TIMESTAMP 条件但是没有给出默认值, 列会自动更新当前时间戳为值,但是不会设置当前时间戳值为默认值。
在这种情况下默认值是独立的类型。如果没有定义NULL特性,则TIMESTAMP的默认值为0,否则值为null.
CREATE TABLE t1 (
  ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
  ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);
DATETIME 默认为 NULL ,除非定义了NOT NULL,默认值为 0.
CREATE TABLE t1 (
  dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
  dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);
TIMESTAMP 和 DATETIME 列没有自动初始化特性,除非他们单独声明,当然也有例外:
如果系统变量explicit_defaults_for_timestamp不可用,第一个 TIMESTAMP 列定义了DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP. 为了自动化有效对于第一个TIMESTAMP列,使用下面这些策略之一:
>系统变量explicit_defaults_for_timestamp可用. 在这种情况下,默认的配置都可以用,但是不会对所有TIMESTAMP列都有效除非单独声明。
>或者,如果explicit_defaults_for_timestamp不可用,那么如下这样:
给列设置特定的默认值。
设置NULL特性。这会使得列允许设置NULL值。也就意味着你不能设置当前时间戳因为设置了列可以为null.设置NUll为列的NULL,而不是当前时间戳。为了设置当前时间戳,设置列为  CURRENT_TIMESTAMP 或者同义的如NOW().
考虑这样的表定义:
CREATE TABLE t1 (
  ts1 TIMESTAMP DEFAULT 0,
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t2 (
  ts1 TIMESTAMP NULL,
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t3 (
  ts1 TIMESTAMP NULL DEFAULT 0,
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                ON UPDATE CURRENT_TIMESTAMP);
表中有这样的特性:
在每张表的定义中, 第一个TIMESTAMP 列没有自动更新特性.
表中对怎么样处理ts1列的null值有不同的值。对弈t1,ts1不允许为NULL,所以设置为当前时间戳。对于t2和t3,ts1允许为null,所以对于null值设置为NULL.
t2和t3的不同在默认值,对于t2,ts1的默认值为null,在没有明确给出默认值的情况下。对于t3,则值为0。
如果一个TIMESTAMP 或者 DATETIME列定义包含了明确的小数表精确度。同样的值必须完整的定义列。这是允许的:


CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);
这是不允许的:
CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);


TIMESTAMP 初始化和NULL特性,如果explicit_defaults_for_timestamp 系统变量不可用, TIMESTAMP 列默认NOT NULL, 不能包含NULL值, 则会设置null为当前时间戳. 如果允许包含null, 明确的声明了NULL特性。在这种情况下,默认值为null,除非单独给出默认的值。默认 NULL 能够用于定义NULL作为默认值。 (对于一个TIMESTAMP列,如果没有声明NULL属性,则NULL值是非法的) 。如果TIMESTAMP允许为NULL。则对于没有值的情况默认值是null,而不是当前时间戳。
下面的表包含一些TIMESTAMP列允许NULL值:
CREATE TABLE t
(
  ts1 TIMESTAMP NULL DEFAULT NULL,
  ts2 TIMESTAMP NULL DEFAULT 0,
  ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);
一个TIMESTAMP列允许NULL值不会使用当前时间戳作为值来插入值除非下面的条件满足:
默认值定义为CURRENT_TIMESTAMP,而且没有给出明确的值。
在列插入时有CURRENT_TIMESTAMP或者同义的比方NOW()被使用。
换句话说,一个TIMESTAMP列定义了允许为NULL值,自动初始化只有它定义中包含了DEFAULT CURRENT_TIMESTAMP:
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
如果定义了允许为null,而且也没有包含默认当前时间戳,你必须明确给出插入的值。假设表 t1 和 t2 有这样的定义:
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');
CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT NULL);
为了设置TIMESTAMP列的值为当前时间戳。必须明确设置它的值例如:
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
INSERT INTO t1 VALUES (NOW());
如果系统变量explicit_defaults_for_timestamp可以用。 TIMESTAMP 列允许NULL值,如果定义的时候给出了。那么TIMESTAMP不会把当前时间戳设置为默认值。不管是否声明为null.为了设置当前时间戳,请使用 CURRENT_TIMESTAMP 或同义的NOW()来插入当前时间戳为值.
-------------------------------------------
11.3.6 Fractional Seconds in Time Values 时间值的小数部分。
MySQL 5.7 对TIME, DATETIME, 和 TIMESTAMP 值都支持小数部分, 最高到 microseconds (6 位数字) 精确度:
为了定义一个列包含小数部分,使用语法type_name(fsp),其中type_name是TIME, DATETIME, 或 TIMESTAMP,fsp是小数部分的精确度。例如:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
如果给出fsp的值,则必须在0到6之间。0则意味着没有小数部分。如果省略,默认精确度是0(这不同于标准SQL模型中的默认值是6)
插入一个带小数部分的TIME, DATE, or TIMESTAMP 值到精确度低的列中会四舍五入,例如如下:


mysql> CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );
Query OK, 0 rows affected (0.33 sec)


mysql> INSERT INTO fractest VALUES
     > ('17:51:04.777', '2014-09-08 17:51:04.777', '2014-09-08 17:51:04.777');
Query OK, 1 row affected (0.03 sec)


mysql> SELECT * FROM fractest;
+-------------+------------------------+------------------------+
| c1          | c2                     | c3                     |
+-------------+------------------------+------------------------+
| 17:51:04.78 | 2014-09-08 17:51:04.78 | 2014-09-08 17:51:04.78 |
+-------------+------------------------+------------------------+
1 row in set (0.00 sec)
当约进产生时没有警告也没有错误。这种行为是允许的在SQL标准中。通过设置不同的SQL模式是不会有任何影响的。
函数可以接受带小数部分秒值的参数。返回值中同样包含了小数部分的秒的大约值。例如 NOW() 没有要求返回当前日期和时间的小数部分,但是一个优化要求从0到6设定返回值中包含小数秒部分包含多位数字。.


语法关于temporal literals 产生temporal values: DATE 'str', TIME 'str', and TIMESTAMP 'str', 和the ODBC-syntax equivalents. 如果设置了,那么结果值中会包含小数部分. 原来, temporal 类型被忽略并且这些结构产生的字符串值. See Standard SQL and ODBC Date and Time Literals
--------------------------------------------------
11.3.7 Conversion Between Date and Time Types 日期和时间类型的转换
为了一些扩展,你能够转变一个值从一个临时类型到另外的类型。然而,他们会产生一些改变或者是丢失一些信息。在所有的情况下,转变主要关心的是结果值的范围。例如虽然 DATE, DATETIME, 和 TIMESTAMP 值都可以被设置使用相同的格式, 但并不是他们有相同的范围。 TIMESTAMP 值不能早于 1970 UTC 或者晚于'2038-01-19 03:14:07' UTC. 这也就是说一个日期 '1968-01-01', 虽然作为一个DATE 或者 DATETIME 值没有问题, 但是对于TIMESTAMP是非法的,并且会被转变为0.
转变DATE值:
转变为一个DATETIME或者TIMESTAMP值添加一个时间部分'00:00:00',因为DATE值不会保存时间信息。
转变为一个TIME值没有用,结果是'00:00:00'.
转变DATETIME 和 TIMESTAMP 值:
转变为一个DATE值会约进小数秒和时间部分。例如'1999-12-31 23:59:59.499' 变为 '1999-12-31', 而'1999-12-31 23:59:59.500' 变为 '2000-01-01'.
转变为TIME值则去掉日期部分,因为TIME类型不包含日期信息。
为了转变一个TIME值或其他临时类型,CURRENT_DATE()的值被使用日期部分.TIME被解释为消逝的时间(没有日期的时间) 和被添加的日期。这也就意味着结果的日期部分不同于当前日期。如果值不在'00:00:00' 到 '23:59:59'范围内的话.
假设当前日期是 '2012-01-01'. 时间值为 '12:00:00', '24:00:00', 和 '-12:00:00',当转变为DATETIME 或 TIMESTAMP 值, 结果分别为 '2012-01-01 12:00:00', '2012-01-02 00:00:00', 和 '2011-12-31 12:00:00'.
转变TIME为DATE也类似但是去掉了结果的时间部分,结果分别为 '2012-01-01', '2012-01-02', 和 '2011-12-31'.
明确的转化能够被用于覆盖隐藏的转化。例如, 对比 DATE 和 DATETIME 值,  DATE值 被强制加时间 '00:00:00'而转变为DATETIME值. 为了完成对比通过忽视DATETIME值的时间部分, 按如下方式使用 CAST() :
date_col = CAST(datetime_col AS DATE)
转变TIME和DATETIME 值到数字格式(例如,通过添加+0)依赖于是否值包含了小数秒部分。 TIME(N) 或者 DATETIME(N) 被转变为整数 当 N 是 0 (or 默认值) 并且 转变为一个N位十进制数当N大于0时:
mysql> SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0;
+-----------+-------------+--------------+
| CURTIME() | CURTIME()+0 | CURTIME(3)+0 |
+-----------+-------------+--------------+
| 09:28:00  |       92800 |    92800.887 |
+-----------+-------------+--------------+
mysql> SELECT NOW(), NOW()+0, NOW(3)+0;
+---------------------+----------------+--------------------+
| NOW()               | NOW()+0        | NOW(3)+0           |
+---------------------+----------------+--------------------+
| 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
+---------------------+----------------+--------------------+
到此关于时间的介绍就结束了,接下来我们要说明的是关于字符串相关的。

猜你喜欢

转载自blog.csdn.net/wu1226419614/article/details/79052980
今日推荐