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数据类型 - 日期和时间类型的主要内容,如果未能解决你的问题,请参考以下文章