排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
MySQL数据类型 - 日期和时间类型(3)
MySQL数据类型 - 日期和时间类型(3)
数据库杂货铺
2021-04-12
404
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
文章转载自
数据库杂货铺
,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨