MySQL数据类型 - 日期和时间类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据类型 - 日期和时间类型相关的知识,希望对你有一定的参考价值。

1.时间值中的小数秒

mysql 的TIME、DATETIME和TIMESTAMP类型的值都支持小数秒,精度高达微秒(6位):

●要定义包含小数秒部分的列,请使用语法type_name(fsp),其中type_name是TIME、DATETIME或TIMESTAMP,fsp是小数秒精度。例如:

技术图片

fsp值(如果给定)必须在0到6的范围内。值为0表示不存在小数部分。如果省略,则默认精度为0。(这和标准的SQL默认值6不同,因为MySQL要与以前的版本兼容。)

● 将带有小数秒部分的TIME、DATETIME或TIMESTAMP值插入表中对应类型的列时,如果列的小数位数少于值中的小数位数,会导致插入值舍入。考虑如下面表的创建和填充:

技术图片

通过舍入插入到表中的时间值:

技术图片

当这种舍入发生时,不会给出警告或错误。此行为遵循SQL标准。

要插入带截断的值,请启用TIME_TRUNCATE_FRACTIONAL SQL模式:
技术图片

启用该SQL模式后,将插入截断后的时间值:

技术图片

● 接受时间参数的函数也接受带有小数秒的值。时间函数的返回值包括适当的小数秒。例如,不带参数的NOW()返回不带小数部分的当前日期和时间,但接受0到6之间的可选参数以指定返回值应该包含多少位的小数秒部分。

2.日期和时间类型之间的转换

在某种程度上,可以将一个值从一种时间类型转换为另一种时间类型。但是,可能会产生数据值的变更或者信息的丢失。在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围。例如,尽管 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‘。TIME值‘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 值的比较中,通过添加时间部分‘00:00:00‘,DATE值被强制转换为DATETIME类型。要通过忽略DATETIME值的时间部分来执行比较,请按以下方式使用CAST()函数:
技术图片

将TIME和DATETIME值转换为数字形式(例如,通过添加+0)取决于该值是否包含小数秒部分。当N为0(或省略)时,TIME(N) 或DATETIME(N)转换为整数;当N大于0时,转换为具有N个小数位的DECIMAL值:

技术图片

3.日期中的2位数年份

具有2位数年份的日期值是不明确的,因为世纪未知。这些值必须解释为4位数的形式,因为MySQL在内部使用4位存储年份。

对于DATETIME、DATE和TIMESTAMP类型,MySQL使用以下规则解释具有不明确年份值的日期:

●00-69范围内的年份值变为2000-2069。

●70-99范围内的年份值变为1970-1999。

对于YEAR,规则是相同的,只有一个例外:插入YEAR中的数字00的结果是0000,而不是2000。若要为年份指定零并将其解释为2000,请将其指定为字符串‘0‘或‘00‘。

请记住,这些规则只是提供合理猜测数据值含义的启发式方法。如果MySQL使用的规则没有生成所需的值,则必须提供包含4位年份值的明确输入。

ORDER BY对具有2位数年份的年份值能进行正确排序。

一些函数,如MIN()和MAX()将YEAR转换为一个数字。这意味着具有2位数年份的值不能被这些函数正确处理。在这种情况下,修复方法是将YEAR转换为4位数的年份格式。

官方文档:
https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

以上是关于MySQL数据类型 - 日期和时间类型的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据类型 - 日期和时间类型

MySQL 数据类型:数值日期和时间字符串等类型详解

MySQL 基础 -- MySQL 数据类型说明(数值类型字符串类型日期时间类型)SQL通用语法和SQL分类

mysql 中,创建表时如何定义一个日期类型的字段

MySQL数据类型 - 日期和时间类型

MySql建表时日期类型的出理