在MySQL数据库的实际使用中,我们经常会从外部导入数据或者接收到前端传递的日期格式字符串,这些字符串本身不是日期类型,无法直接进行日期加减、日期比较等操作,这时候就需要使用STR_TO_DATE函数将其转换为标准的日期时间类型。

STR_TO_DATE函数基本语法
STR_TO_DATE函数的作用是将给定的日期字符串按照指定的格式转换为日期、时间或者日期时间类型,基本语法如下:
STR_TO_DATE(str, format)
其中str是需要转换的日期字符串,format是字符串对应的日期格式,函数会按照format的规则解析str,返回对应的日期时间值,如果解析失败则返回NULL。
常用格式符说明
格式符是STR_TO_DATE函数的核心,不同的格式符对应日期字符串中不同的部分,常用的格式符可以参考下表:
| 格式符 | 说明 | 示例 |
|---|---|---|
| %Y | 四位年份 | 2024 |
| %y | 两位年份 | 24 |
| %m | 月份,01到12 | 03 |
| %c | 月份,1到12 | 3 |
| %d | 日期,01到31 | 05 |
| %e | 日期,1到31 | 5 |
| %H | 小时,00到23 | 14 |
| %h | 小时,01到12 | 02 |
| %i | 分钟,00到59 | 30 |
| %s | 秒,00到59 | 45 |
| %p | AM或者PM | PM |
不同场景的使用示例
解析标准格式日期字符串
如果日期字符串是年-月-日的格式,对应的格式符就是%Y-%m-%d,示例如下:
-- 解析2024-03-15格式的字符串
SELECT STR_TO_DATE('2024-03-15', '%Y-%m-%d') AS result;
-- 返回结果:2024-03-15
解析带时间的日期字符串
如果字符串包含时间部分,只需要补充对应的时间格式符即可,比如解析2024/03/15 14:30:25格式的字符串:
-- 解析带时间的日期字符串
SELECT STR_TO_DATE('2024/03/15 14:30:25', '%Y/%m/%d %H:%i:%s') AS result;
-- 返回结果:2024-03-15 14:30:25
解析非标准分隔符的日期字符串
日期字符串的分隔符可以是任意字符,只需要在格式符中对应位置写上相同的分隔符即可,比如解析15.03.2024格式的字符串:
-- 解析使用点作为分隔符的日期字符串
SELECT STR_TO_DATE('15.03.2024', '%d.%m.%Y') AS result;
-- 返回结果:2024-03-15
解析12小时制的时间字符串
如果时间字符串是12小时制,需要搭配%p格式符来识别AM和PM:
-- 解析12小时制的时间字符串
SELECT STR_TO_DATE('03/15/2024 02:30:25 PM', '%m/%d/%Y %h:%i:%s %p') AS result;
-- 返回结果:2024-03-15 14:30:25
常见错误及解决方法
格式符与字符串不匹配
这是最常见的错误,比如字符串是2024-3-5,月份和日期是一位数,却使用了%m和%d格式符,就会导致解析失败:
-- 错误示例:格式符不匹配
SELECT STR_TO_DATE('2024-3-5', '%Y-%m-%d') AS result;
-- 返回结果:NULL
-- 正确写法:使用%c和%e匹配一位数的月份和日期
SELECT STR_TO_DATE('2024-3-5', '%Y-%c-%e') AS result;
-- 返回结果:2024-03-05
字符串包含多余字符
如果日期字符串中包含格式符没有覆盖的字符,也会导致解析失败,比如字符串是2024-03-15 星期三,后面的星期几部分没有对应的格式符:
-- 错误示例:字符串有多余字符
SELECT STR_TO_DATE('2024-03-15 星期三', '%Y-%m-%d') AS result;
-- 返回结果:NULL
-- 解决方法:可以先截取字符串再转换,或者使用忽略多余字符的方式
SELECT STR_TO_DATE(SUBSTRING('2024-03-15 星期三', 1, 10), '%Y-%m-%d') AS result;
-- 返回结果:2024-03-15
两位年份的歧义问题
使用%y解析两位年份时,MySQL默认的规则是70-99对应1970-1999,00-69对应2000-2069,如果需要自定义规则,可以通过设置default_year参数调整,不过更推荐尽量使用四位年份避免歧义。
使用注意事项
- 转换后的日期时间类型可以直接参与日期运算,比如和CURDATE()函数的结果比较大小,或者进行DATE_ADD等运算。
- 如果解析的字符串不符合公历日期规则,比如2月30号,函数也会返回NULL。
- 在插入数据到日期类型的字段时,也可以直接使用STR_TO_DATE函数转换字符串后插入,避免类型不匹配的错误。
需要注意的是,STR_TO_DATE函数的返回结果类型取决于字符串解析后的内容,如果只包含日期则返回DATE类型,包含时间则返回DATETIME类型,包含时区相关则返回TIMESTAMP类型。
MySQLSTR_TO_DATE日期解析日期格式化修改时间:2026-07-05 04:09:26