1.日期和时间数据类型语法
用于表示时间值的日期和时间数据类型是DATE, TIME, DATETIME, TIMESTAMP和 YEAR。
对于TIME, DATETIME和 TIMESTAMP值,MySQL支持小数秒,精度可达微秒(6位数)。要定义包含小数秒部分的列,请使用语法type_name(fsp),其中type_name是TIME、DATETIME或TIMESTAMP,fsp是小数秒精度。例如:
fsp值(如果给定)必须在0到6的范围内。值为0表示不存在小数部分。如果省略,则默认精度为0。(这与标准的SQL默认值6不同,是为了与以前的MySQL版本兼容。)
表中的任何TIMESTAMP或DATETIME列都可以自动初始化和更新:
●DATE
日期值,支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式显示DATE值,但允许使用字符串或数字将值分配给DATE列。
●DATETIME[(fsp)]
日期和时间的组合。支持的范围是'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.999999'。MySQL以'YYYY-MM-DD hh:MM:ss[.fraction]'格式显示DATETIME值,但允许使用字符串或数字将值分配给DATETIME列。
可以给出0到6范围内的可选fsp值,以指定小数秒精度。值为0表示不存在小数部分。如果省略,则默认精度为0。
可以使用列定义子句DEFAULT为DATETIME列自动初始化到当前日期和时间,使用列定义子句ON UPDATE为DATETIME列更新到当前日期和时间。
●TIMESTAMP[(fsp)]
时间戳。范围是'1970-01-01 00:00:01.000000' UTC到'2038-01-19 03:14:07.999999' UTC。TIMESTAMP值存储为自'1970-01-01 00:00:00' UTC以来的秒数。它不能表示值'1970-01-01 00:00:00',因为这相当于0秒,而值0保留为表示'0000-00-00 00:00:00',TIMESTAMP的零值。
可以给出0到6范围内的可选fsp值,以指定小数秒精度。值为0表示不存在小数部分。如果省略,则默认精度为0。
服务器处理TIMESTAMP定义的方式取决于explicit_defaults_for_timestamp系统变量值。
如果启用了explicit_defaults_for_timestamp,则不会自动将DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性分配给任何TIMESTAMP列。它们必须显式地包含在列定义中。此外,任何未显式声明为NOT NULL的TIMESTAMP都允许空值。
如果禁用explicit_defaults_for_timestamp,服务器将按如下方式处理TIMESTAMP:
除非另有指定,否则表中的第一个TIMESTAMP列定义为,如果未显式分配值,则自动设置为最近修改的日期和时间。这使得TIMESTAMP对于记录INSERT或UPDATE操作的时间戳非常有用。
如果TIMESTAMP列没有被定义为NULL,为它分配NULL值就相当于分配了当前日期和时间。
可以使用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP列定义子句自动初始化或更新到当前日期和时间。默认情况下,如前所述,第一个TIMESTAMP列具有这些属性。但是,表中的任何TIMESTAMP列都可以定义为具有这些属性。
●TIME[(fsp)]
时间。范围是'-838:59:59.000000'到'838:59:59.000000'。MySQL以'hh:mm:ss[.fraction]'格式显示TIME值,但允许使用字符串或数字将值分配给TIME列。
可以给出0到6范围内的可选fsp值,以指定小数秒精度。值为0表示不存在小数部分。如果省略,则默认精度为0。
●YEAR[(4)]
四位数格式的年。MySQL以YYYY格式显示YEAR值,但允许使用字符串或数字将值分配给YEAR列。值显示范围从1901到2155,或者0000。
SUM()和AVG()聚合函数不能处理时间值。(它们将值转换为数字,将丢弃第一个非数字字符之后所有内容。)若要解决此问题,请转换为数字单位,执行聚合操作,然后转换回时间值。示例:
2.DATE、 DATETIME 和 TIMESTAMP类型
DATE、DATETIME 和 TIMESTAMP类型是相关的。本节介绍了它们的特点、相似之处和不同之处。MySQL可以识别多种格式的DATE、DATETIME和TIMESTAMP 值。
DATE类型用于具有日期但没有时间部分的值。MySQL以'YYYY-MM-DD'格式检索并显示DATE值。支持的范围是'1000-01-01'到'9999-12-31'。
DATETIME类型用于同时包含日期和时间部分的值。MySQL以'YYYY-MM-DD hh:MM:ss'格式检索并显示DATETIME值。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
TIMESTAMP数据类型用于包含日期和时间部分的值。TIMESTAMP的范围是'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。
DATETIME或TIMESTAMP值可以包含小数秒部分,最高达微秒(6位)精度。特别是,插入DATETIME或TIMESTAMP列中的任何小数部分都将被存储而不是丢弃。包含小数部分时,这些值的格式为'YYYY-MM-DD hh:MM:ss[.fraction]',DATETIME值的范围为'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.999999',TIMESTAMP值的范围为'1970-01-01 00:00:01.000000'到'2038-01-19 03:14:07.999999'。小数部分应始终与其余时间用小数点分隔;不能用其他小数秒分隔符。
MySQL存储时将TIMESTAMP值从当前时区转换为UTC,检索时从UTC转换为当前时区。(其他类型(如DATETIME)不会发生这种情况。)默认情况下,每个连接的当前时区是服务器的时间。时区可以根据每个连接进行设置。只要时区设置保持不变,就可以得到存储的相同值。如果存储TIMESTAMP值,然后更改时区并检索该值,则检索到的值与存储的值不同。发生这种情况的原因是没有使用同一时区在两个方向上进行转换。可以从系统变量 time_zone 中得到当前时区。
从MySQL 8.0.19开始,在向表中插入TIMESTAMP和DATETIME值时,可以指定时区偏移量。偏移量被附加到日期时间后面(原文可能有误,具体参加最下方原始文档),不包含空格,并使用与设置 time_zone 系统变量相同的格式,但有以下例外情况:
●对于小于10的小时值,需要加前导零。
●不允许'-00:00'值。
●不能使用'EET'和'Asia/Shanghai'等时区名称;也不能使用'SYSTEM'。
此示例演示如何使用不同的时区设置将带有时区偏移的日期时间值插入TIMESTAMP和DATETIME列,然后检索它们:
查询结果中日期时间值不显示偏移量,即使在插入时使用了偏移量。
支持的偏移量范围为-14:00到+14:00(含)。
包含时区偏移量的日期时间字面值作为整体的参数值传入语句。
如果SQL模式允许,则无效的DATE、DATETIME和TIMESTAMP值将转换为对应类型的"零"值('0000-00-00'或'0000-00-00 00:00')。具体行为取决于是否启用了严格SQL模式或NO_ZERO_DATE SQL模式。
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。
●MySQL不接受在日或月值是0的TIMESTAMP值或不是有效日期的值。如果SQL模式允许,则此规则的唯一例外是特殊的零值'0000-00-00 00:00:00'。具体的行为取决于是否启用了严格SQL模式和NO_ZERO_DATE SQL模式。
●包含两位数年份的日期值不明确,因为世纪值未知。MySQL使用以下规则解释2位数的年份值:
① 70-99之间的年份值将变为1970-1999。
② 00-69之间的年份值将变为2000-2069。
3.TIME 类型
MySQL以'hh:mm:ss'格式检索和显示TIME值(小时值数字大时用'hhh:mm:ss'格式)。TIME值的范围从'-838:59:59'到'838:59:59'。小时值可能很大,因为时间类型不仅可以用来表示一天中的某个时间(必须小于24小时),还可以表示经过的时间或两个事件的时间间隔(可能远远大于24小时,甚至为负)。
MySQL可以识别多种格式的TIME值,其中一些格式可以包含最高达微秒(6位)精度的小数秒部分。特别是,插入TIME列的值中的任何小数部分都将被存储而不是丢弃。包含小数部分时,TIME值的范围为'-838:59:59.000000'到'838:59:59.000000'。
将缩写值分配给TIME列时请务必当心。MySQL将带有冒号的缩写TIME值解释为一天中的时间。例如,'11:12'是指'11:12:00',而不是'00:11:12'。如果缩写值不含冒号,MySQL使用最右边的两个数字表示秒(即,这个时间是一段时间而不是一天中的某个时间)。例如,您可能认为'1112'和1112表示'11:12:00'(11点12分钟),但MySQL将其解释为'00:11:12'(11分钟12秒)。类似地,'12'和12被解释为'00:00:12'。
时间部分和小数秒部分之间唯一可识别的分隔符是小数点。
默认情况下,位于TIME范围之外但在其他情况下有效的值将被剪裁到范围的最近端点。例如,'-850:00:00'和'850:00:00'转换为'-838:59:59'和'838:59:59'。无效的TIME值转换为'00:00:00'。请注意,由于'00:00:00'本身是一个有效的TIME值,因此无法从存储在表中的'00:00:00'值判断原始值是指定为'00:00:00'还是一个无效值。
4.YEAR 类型
YEAR类型是一个1字节数据类型,用于表示年份值。它可以声明为隐式显示宽度为4个字符的年份,也可以显式声明显示宽度YEAR(4),和隐式声明效果是等同的。
从MySQL 8.0.19开始,不推荐使用具有显式显示宽度的YEAR(4)数据类型,并且在以后的MySQL版本中将删除对它的支持。请使用不带显示宽度的年份,其含义相同。
MySQL 8.0不支持旧版本MySQL中允许的2位数YEAR(2)数据类型。
MySQL以YYYY格式显示YEAR值,范围是1901到2155和0000。
YEAR接受多种格式的输入值:
●'1901'到'2155'范围内的4位字符串。
●1901到2155范围内的4位数字。
●'0'到'99'范围内的1位或2位字符串。MySQL将范围'0'到'69'和'70'到'99'的值分别转换为2000到2069和1970到1999之间的YEAR值。
●0到99范围内的1位或2位数字。MySQL将范围为1到69、70到99的值分别转换为范围为2001到2069和1970到1999的YEAR值。
插入数字0的结果的显示值为0000,内部值为0000。若要插入零并将其解释为2000,请将其指定为字符串'0'或'00'。
●YEAR可接受的函数返回结果,例如NOW()。
如果没有启用严格的SQL模式,MySQL会将无效的YEAR值转换为0000。在严格的SQL模式下,尝试插入无效的YEAR值会引发错误。
文章来源: blog.51cto.com,作者:数据杂货铺,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.51cto.com/15023289/2561177