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

11.3 Date and Time Types 日期和时间类型
11.3.1 The DATE, DATETIME, and TIMESTAMP Types 日期,日期时间,和时间戳类型
11.3.2 The TIME Type 时间类型
11.3.3 The YEAR Type 年类型
11.3.4 YEAR(2) Limitations and Migrating to YEAR(4) 2位数年的限制和迁移到4位年
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME 自动初始化和更新时间戳和日期时间类型。
11.3.6 Fractional Seconds in Time Values 时间值中的分数秒
11.3.7 Conversion Between Date and Time Types 日期和时间类型的转变
11.3.8 Two-Digit Years in Dates 日期中的两位数年
日期和时间类型表示的时间值是DATE, TIME, DATETIME, TIMESTAMP, 和 YEAR。每一个时间值都有个可用值范围,当一个“0”值被用于设置一个不可用值时MySQL不能表示。TIMESTAMP 类型可以自动更新,之后会描述。对于时间值类型的存储要求,请看11.8的数据类型存储。
当使用日期和时间类型时下面是需要注意:
>MySQL对于给出的日期和时间类型的检索有一个标准的输出。但它会试着解释为多种格式对于你给出的输入值(例如,当你给出一个被标记的值或者对比日期或者时间类型)。对于允许的日期和时间格式,请看9.1.3日期和时间描述。当你输入允许值时可以解析,如果你使用的是其他格式的值,则可能是不可预测的结果。
虽然MySQL试着用多种格式解析值,日期部分必须是年-月-日的顺序(例如,‘98-09-04’),而不是月-天-年或者天-月-年的顺序。
由两位数的年组成的日期值是模糊的,因为世纪是未知到的。mysql解析两位数的年的规则如下:
年的值在70-99则转变为1970-1999.
年的值在00-69则转变为2000-2069.
具体请看11.3.8的两位年的日期。
转变一个时间值到另一个值的规则看11.3.7的日期和时间类型间的转变。
MySQL 自动转变一个日期或者时间值到一个数字。如果值被用在一个数字环境和反之亦然。
默认情况下,当MySQL遇到的日期或者时间类型的值超出范围或者非法的类型的话,它转变值为当前类型的"0"值。特别的是,超出范围的时间值被裁剪到时间范围内的适当端点。
通过设置SQL模型到一个合适的值,你能设置更准确的MySQL支持的日期类型。(请看5.1.8的服务SQL模型)你能够得到MySQL来访问确定的日期,例如'2009-11-31',通过设置ALLOW_INVALID_DATES的SQL模式。
这是有用的,当你想要存储一个"可能错误"的值,用户设定的(例如,网页形式)在数据库在未来的程序。在这种模式下,MySQL只验证月的范围1到12,日期的范围是1到31.
MySQL允许你存储日期在一个DATE或者DATETIME列,其中日期值的day或month的值为0.这比较有用的是应用中需要存储生日但你不能知道准确日期。在这种情况下,你可以简单存储日期如'2009-00-00' 或者'2009-01-00'。如果你像这样存储日期,那你可能不会得到一个精确的值通过函数DATE_SUB()或者DATE_ADD()方法。为了不接受0月或日期部分在日期,需要开启NO_ZERO_IN_DATE模式。
MySQL允许你存储一个0值‘0000-00-00’作为一个默认日期。这在一些情况下比使用NULL值更方便。并且使用更少的数据和索引空间。如果不允许存储‘0000-00-00’,需要开启NO_ZERO_DATEM模式。
‘0’日期或时间值如果通过连接/ODBC被自动转换为NULL,因为ODBC不能处理这样的值。
下面的表中展示了每种类型的“0”值的格式。"0"值是特殊值,但是你能存储或者引用他们明确使用值展示在表中的。你也可以使用'0'或者0来完成,这很容易写。对于包含了日期部分的时间类型(DATE, DATETIME, and TIMESTAMP),使用这些值会产生警告,如果SQL模式是NO_ZERO_DATE.

如图所示:


----------------------------------------------------
11.3.1 The DATE, DATETIME, and TIMESTAMP Types
DATE, DATETIME, 和 TIMESTAMP 类型是相关的. 这部分描述了他们的特点,他们的相似点和不同点。MySQL可以识别多种格式的DATE, DATETIME, 和 TIMESTAMP,具体描述请看9.1.3的“Date and Time Literals”. 关于DATE and DATETIME类型的范围描述,"支持"意味着虽然早期的值可以工作,但是不做保证。
DATE类型用于在一个日期部分但没有时间部分。MySQL检索和展示DATE值以"YYYY-MM-DD"格式.
支持的值范围是:'1000-01-01' to '9999-12-31'.
DATETIME类型被用于值包含日期和时间部分。MySQL检索和展示DATETIME值以'YYYY-MM-DD HH:MM:SS'格式。支持的范围是'1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
TIMESTAMP数据类型也用于包含日期和时间部分的值,其表示的范围是'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。
一个DATETIME 或者 TIMESTAMP值能够包含小数点后6位的microseconds精确度。尤其是,任何在插入的DATETIME 或 TIMESTAMP值中的小数部分会被存储而不是丢弃。包含小数部分的格式是这样的'YYYY-MM-DD HH:MM:SS[.fraction]'。DATETIME的值的范围是'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999',并且TIMESTAMP值范围是'1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'。
小数部分应该始终与其余时间间隔一个小数点;而其他小数秒分隔符没有办法识别。更多信息关于MySQL支持的小数秒部分。请看11.3.6的分数秒在时间值。
TIMESTAMP 和 DATETIME时间类型提供对当前日期和时间的自动初始化和更新。更多信息,请看11.3.5的自动初始化和更新TIMESTAMP和DATETIME.
MySQL转变TIMESTAMP值从当前时间区到UTC然后存储,当查找时再从UTC转变为当前时间区然后展示。这对于DATETIME这样的其他类型是不会发生的。默认情况下,对于每一个连接的当前时区是服务时间。时间区可以被设置在连接之前。只要设置时间区设置为固定值,则你可以得到和你存储的相同的值。如果你存储一个TIMESTAMP值,然后改变了时区并且查找值,返回的值可能和你存储的是不同的值。会发生这种情况是因为没有使用相同的时区来处理时间。
当前时区是在系统变量time_zone中可用的变量的值。更多信息请看10.6的MySQL服务时间区的支持。
非法的DATE, DATETIME, 或者 TIMESTAMP 值被转变为"0"值,可能的类型为('0000-00-00' or '0000-00-00 00:00:00')
在MySQL中解析对日期值的属性需要知道:
>MySQL允许一个轻松的格式对于字符串表示的值,其中任何标点符号都可以用作日期部分或时间部分之间的分隔符。在一些情况下,这种语法可能被欺骗。例如值'10:11:12'看起来可能是个时间值因为:但是被解析为一个年'2010-11-12'如果使用一个日期上下文。值'10:45:15'被转变为'0000-00-00',因为45不是一个合法的月。
只有日期和时间部分和小数点秒部分的分隔符是小数点。
服务器要求月和天的值是合法的,并且不仅仅是值范围分别是1到12和1到31,有严格的可用模式,非法日期如'2004-04-31'也会被转为'0000-00-00'并且产生一个警告。如果使用严格的可用模型,非法日期会产生一个错误。为了允许这样的日期,可以开启ALLOW_INVALID_DATES模式。请看5.1.8的服务器的SQL模式来了解更多信息。
MySQL不接受TIMESTAMP值中包含“0”在一个天或者月的列或者值是非法值。唯一例外对这条规则是特别的’0‘值'0000-00-00 00:00:00'。
日期包含两位数的年值是模糊的因为世纪的未知性。MySQL解析两位数的年规则:
年值在00-69,则被转变为2000-2069
年值在70-99,则被转变为1970-1999。
请看11.3.8的两位年的日期。
注意:
MySQL服务器能够运行MAXDB SQL模型。在这种情况下,TIMESTAMP和DATETIME是相同的。如果开启这种模式在表被创建的时候,TIMESTAMP列会作为DATETIME列来创建。结果是,这样的列会使用DATETIME展示格式,有相同的值范围,并且没有自动初始化或者更新当前日期和时间,具体请看5.1.8的服务器的SQL模型。
------------------------------------------
11.3.2 The TIME Type 时间类型
MySQL检索和展示TIME值格式为'HH:MM:SS'(或者'HHH:MM:SS'对大小时值的格式).时间值的范围是'-838:59:59' to '838:59:59'。小时值部分这么大是因为时间类型不仅仅是表示一天的时间(小于24小时),而且可能是一个共用时间或者一个区域时间(可能大于24小时,或者甚至是负数时间)
MySQL识别TIME值的多种格式,其中一些包括带小数点最多6位的microseconds的精确度时间。具体请看9.1.3的日期和时间格式。关于MySQL支持的小数秒信息,请看11.3.6的小数秒的时间值。当然任何小数部分要添加到TIME列的值都不会被去掉而是保留下来。包含小数部分的值的范围是'-838:59:59.000000' to '838:59:59.000000'.
注意标记TIME列的缩写值。Mysql解析时间列的缩写值为日期中的时间。也就是说“11:22"是'11:12:00', 而不是 '00:11:12'。MySQL解析缩写的值在没有冒号的情况下,使用最右边的数字代表秒数。(也就是经过时间,而不是日期时间)。例如你可能认为'1112' 和 1112 意味着 '11:12:00'(11点过12分钟),但是MySQL解析他们当做'00:11:12'(11分11秒),简单来说,’12‘和12被解析为'00:00:12'。
只有时间和小数秒之间的分隔符是十进制点。
默认情况下,在时间范围之外的值,但在其他情况下是有效的,这些值被剪切到距离最近的端点。例如,'-850:00:00' and '850:00:00'被转变为'-838:59:59' and '838:59:59'。非法的时间值被转变为'00:00:00'。因为'00:00:00'本身是一个有效TIME值。没有方法知道在表中存储的'00:00:00'是原来就这样还是其他的非法值。
更多关于对非法值的限制。对非法的时间格式会产生错误,请看5.1.8的服务器SQL模式。
-----------------------------
11.3.3 The YEAR Type 年的类型
YEAR类型是一种使用1字节来代表年值。它能够声明为一个YEAR or YEAR(4)并且能够展示4个字符的宽度。
注意:
   YEAR(2)的数据类型是不推荐的,而且在5.7.5版本中会移除对其的支持。为了转变2位年到4位,请看11.3.4的YEAR(2)限制和转移到YEAR(4).
MySQL展示年格式是YYYY,范围是1901到2155,或者0000.
你能够设置输入年的值有多种格式:
>4位数字年范围1901 to 2155.
>4位数字的字符串年范围是'1901' to '2155'.
>1-或者2-数字值范围1到99.Mysql转变1到69和70到99的年分别到范围2001到2069和1970到1999
>当1-或者2-字符串范围是'0' to '99'。MySQL转变'0' 到 '69' 和 '70' 到'99'的年分别为
2000 to 2069 and 1970 to 1999
>添加数字0的结果就是展示值为0000且内部值为0000.为了添加0和将它解析为2000,需要设置其为字符串'0' or '00'。
>作为一个函数的结果,它返回一个在一年内可以接受的值,例如NOW().
MySQL转变非法年为0000。
更多看11.3.8的日期中的两位数字年。

猜你喜欢

转载自blog.csdn.net/wu1226419614/article/details/78994739