MySQL日期类型转换指南:Cast/Convert、Date_Format与Str_To_Date详解
在MySQL开发中,经常需要将日期、时间与字符串或其他数据类型进行转换。本文系统介绍了三种核心转换方法:利用Cast()和Convert()进行基础类型互转,使用Date_Format()灵活控制输出样式,以及通过Str_To_Date()逆向解析字符串。这些方法涵盖了日常开发中日期的显示、存储及计算场景,助力高效解决数据格式问题。
1. 使用 Cast() 和 Convert() 实现基础类型转换
这两个函数是MySQL中进行显式类型转换最通用的工具。它们可以将表达式转换为指定的数据类型,如字符串(char)、日期(date)、时间(time)、日期时间(datetime),以及数值类型(浮点型decimal、整数signed、无符号整数unsigned)。
语法与示例操作
语法格式:
convert( 表达式, 数据类型 )cast( 表达式 as 数据类型 )
关键参数说明:
表达式:需要被转换的原始值(如NOW())。数据类型:目标类型,常用SIGNED(有符号整数) 或CHAR(字符串)。
实操验证:
- 转换为整数(Signed):将当前时间戳转换为数字格式。
mysql> select cast(now() as signed); +-----------------------+ | cast(now() as signed) | +-----------------------+ | 20201030042922 | +-----------------------+ 1 row in set (0.00 sec) mysql> select convert(now(),signed); +-----------------------+ | convert(now(),signed) | +-----------------------+ | 20201030042933 | +-----------------------+ 1 row in set (0.00 sec)
- 转换为字符(Char):将时间转换为默认的日期时间字符串格式。
mysql> select cast(now() as char); +---------------------+ | cast(now() as char) | +---------------------+ | 2020-10-30 04:29:44 | +---------------------+
2. 使用 Date_Format() 自定义日期显示格式
当需要将日期或时间数据转换为符合特定规范的字符串时(如日志记录、报表展示),Date_Format() 是最佳选择。它支持丰富的格式化占位符。
第1步:定义日期与时间输出格式
语法: date_format(date, format)
参数:
date:合法的日期或时间值。format:规定输出的字符串格式。
常用格式代码表:
| 格式 | 描述 | 格式 | 描述 |
|---|---|---|---|
| %Y | 年,4位 (如 2020) | %m | 月,数值(00-12) |
| %M | 月名 (如 October) | %d | 日的天,数值(00-31) |
| %H | 小时 (00-23) | %i | 分钟,数值(00-59) |
| %s/%S | 秒(00-59) | %p | AM 或 PM |
| %W | 星期名 (如 Sunday) | %w | 周的天 (0=星期日...6=星期六) |
| %a | 缩写星期名 | %D | 带有英文前缀的月中的天 (如 1st) |
第2步:应用示例——日期转字符串
将当前时间转换为 "年-月-日" 格式:
mysql> select date_format(now(),'%Y-%m-%d'); +-------------------------------+ | date_format(now(),'%Y-%m-%d') | +-------------------------------+ | 2020-10-30 | +-------------------------------+
第3步:综合案例——计算用户年龄
假设有一个学生表 student,包含出生日期字段 Brithdate,需要查询前两位学生的当前年龄。
操作逻辑:
- 使用
NOW()获取当前日期。 - 利用
Date_Format(NOW(), '%Y')提取当前年份字符串。 - 利用
Date_Format(Brithdate, '%Y')提取出生年份字符串。 - 外层包裹
CONVERT(..., SIGNED)将年份转为整数相减。
执行SQL:
-- 查看原始数据
mysql> select * from student limit 2;
+------------+-----------+-----+------------+-----------------------+---------+
| Sid | Sname | Sex | Brithdate | Specialty | AScores |
+------------+-----------+-----+------------+-----------------------+---------+
| 2011216001 | 赵成刚 | 男 | 1992-05-05 | 计算机应用技术 | 405.0 |
| 2011216002 | 李婧 | 女 | 1992-01-06 | 计算机应用技术 | 395.5 |
+------------+-----------+-----+------------+-----------------------+---------+
-- 计算并输出年龄
mysql> select sname,
-> convert(date_format(now(),'%Y'),signed)-convert(date_format(Brithdate,'%Y'),signed) as '年龄'
-> from student
-> limit 2;
+-----------+--------+
| sname | 年龄 |
+-----------+--------+
| 赵成刚 | 28 |
| 李婧 | 28 |
+-----------+--------+3. 使用 Str_To_Date() 实现字符串转日期
当从外部导入数据或接收前端字符串参数时,通常需要使用 Str_To_Date() 将其解析为 MySQL 内部的 Date 或 DateTime 类型,以便进行时间比较或计算。
语法与规则
语法: str_to_date(date, format)
注意事项:
- 纯数字要求:待转换的字符串内容中只能出现数字(除分隔符外),否则可能返回 NULL。
- 默认拼接规则:如果格式字符串仅包含日期部分(无时间),且输入字符串至少包含8位数字,MySQL 会自动按“前4位年、中间2位月、后2位日”解析,结果自动用
-拼接。 - 有效性校验:转换后的日期必须合法(如月份不能为13,日期不能超过当月最大天数),否则返回 NULL。
- 长度截断:若字符串超过8位且格式中无时间定义,自动取前8位进行日期转换。
实操示例
- 标准日期转换:将短日期字符串转为完整日期格式。
mysql> select str_to_date('2020-10-3','%Y-%m-%d');
+-------------------------------------+
| str_to_date('2020-10-3','%Y-%m-%d') |
+-------------------------------------+
| 2020-10-03 |
+-------------------------------------+- 不匹配格式的处理:若格式仅指定年,但输入含日月信息,结果中的日月部分会归零。
mysql> select str_to_date('2020-10-3','%Y');
+-------------------------------+
| str_to_date('2020-10-3','%Y') |
+-------------------------------+
| 2020-00-00 |
+-------------------------------+
-- 注意:此处结果取决于具体MySQL版本实现,通常不规范输入需谨慎- 时间字符串转换:将小时分钟字符串转为完整时间。
mysql> select str_to_date('10:11','%H:%i:%S');
+---------------------------------+
| str_to_date('10:11','%H:%i:%S') |
+---------------------------------+
| 10:11:00 |
+---------------------------------总结
掌握 CAST/CONVERT 的基础类型互转、DATE_FORMAT 的美化输出以及 STR_TO_DATE 的数据入库解析,是 MySQL 日期处理的三大支柱。在实际项目中,务必确保输入数据的格式与预期严格一致,避免因格式不匹配导致的 NULL 值错误。以上就是 MySQL 日期类型转换的详细内容,更多关于 MySQL 日期处理函数的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









