STR_TO_DATE函数用于将字符串转变为日期/时间值
STR_TO_DATE函数与DATE_FORMAT函数的作用是相反的
语法格式
STR_TO_DATE(str,format)
srt:要格式化为日期的字符串(输入字符串)
format:要使用的格式字符串
如果不能按照format解析str,STR_TO_DATE函数将返回NULL
如果其中任何一个参数为NULL,STR_TO_DATE函数将返回NULL
提示Tips:用于构建日期格式字符串的说明符及其含义如下表所示
限定符 | 含义 |
%a | 三个字符缩写的工作日名称,例如: Mon,Tue,Wed等 |
%b | 三个字符缩写的月份名称,例如: Jan,Feb,Mar等 |
%c | 以数字表示的月份值,例如: 1, 2, 3…12 |
%D | 以数字表示月份中的某天(可理解为一个月之中的第几天),后跟英文后缀,例如: 1st,2nd,3rd等 |
%d | 以数值表示月份中的某天,如果是小于10的数字,该数字需要加前导0 , 例如: 00,01,02, …31 |
%e | 以数值表示月份中的某天,小于10的数字不需要加前导0,例如: 1,2,… 31 |
%f | 微秒,范围在(000000到999999) |
%H | 24小时格式的小时,前导加0 ,例如: 00,01…23 |
%h | 12小时格式的小时,前导加0,例如: 00,01 … 12 |
%Ⅰ | 与%h相同 |
%i | 分钟,范围在00到59 |
%j | 一年中的的第几天,前导加0 ,例如: 001,002,… 366 |
%k | 24小时格式的小时,无前导0,例如: 0,1,2 … 23 |
%l | 12小时格式的小时,无前导0,例如: 1,2 … 12 |
%M | 月份全名称,例如: January, February…December |
%m | 以数值形式显示的月份名称,前导加0,例如: 01,02,… 12 |
%p | AM或PM,取决于其他时间说明符 |
%r | 表示时间,12 小时格式hh:mm:ss AM/PM |
%S | 秒,前导加0 ,例如: 00,01…59 |
%s | 与%S相同 |
%T | 表示时间,24小时格式hh:mm:ss |
%U | 表示周数,星期日为一周的第一天,例如:00,01,02 … 53时,前导0的周数 |
%u | 表示周数,星期一为一周的第一天,例如:00,01,02 … 53时,前导0的周数 |
%V | 与%U相同,它与%X一起使用 |
%v | 与%u相同,它与%x一起使用 |
%W | 工作日的全称,例如: Sunday, Monday,…, Saturday |
%w | 工作日,以数字来表示(0 = 星期日,6 = 星期六) |
%X | 周的四位数表示年份,第一天是星期日,经常与%V一起使用 |
%x | 周的四位数表示年份,第一天是星期一,经常与%v一起使用 |
%Y | 表示年份,四位数,例如: 2000,2001,…等 |
%y | 表示年份,两位数,例如: 00,01,…等 |
%% | 将百分比(%)字符添加到输出 |
常用的的format格式
常用的格式字符串 | 示例 | 结果 |
%Y/%m/%d | SELECT STR_TO_DATE('2022/11/01','%Y/%m/%d'); | 2022-11-01 |
%Y-%m-%d | SELECT STR_TO_DATE('2022-11-02','%Y-%m-%d'); | 2022-11-02 |
%e/%c/%Y | SELECT STR_TO_DATE('03/11/2022','%e/%c/%Y'); | 2022-11-03 |
%d/%m/%Y %H:%i | SELECT STR_TO_DATE('04/11/2022 13:30','%d/%m/%Y %H:%i'); | 2022-11-04 13:30:00 |
%b %d %Y %h:%i %p | SELECT STR_TO_DATE('Nov 05 2022 02:30 PM','%b %d %Y %h:%i %p'); | 2022-11-05 14:30:00 |
%Y-%m-%d %T | SELECT STR_TO_DATE('2022-11-06 17:29:30','%Y-%m-%d %T'); | 2022-11-06 17:29:30 |
%W %D %M %Y %T | SELECT STR_TO_DATE('Monday 7th November 2022 13:45:30','%W %D %M %Y %T'); | 2022-11-07 13:45:30 |
%M,%e,%Y | SELECT STR_TO_DATE('November,8,2022', '%M,%e,%Y'); | 2022-11-08 |
%W %M %e %Y | SELECT STR_TO_DATE('Wednesday November 09 2022', '%W %M %e %Y'); | 2022-11-09 |
%Y,%m,%d %h,%i,%s | SELECT STR_TO_DATE('2022,11,10 12,12,12', '%Y,%m,%d %h,%i,%s'); | 2022-11-10 00:12:12 |
练习案例
将字符串转换为DATE值
-- 2022-05-25
SELECT STR_TO_DATE('25,5,2022','%d,%m,%Y');
-- 2022-05-26
SELECT STR_TO_DATE('2022-05-26 11:30:00','%Y-%m-%d');
-- 2022-08-05
SELECT STR_TO_DATE('August,5,2022', '%M,%e,%Y');
-- 2022-08-10
SELECT STR_TO_DATE('August 10 2022', '%M %d %Y');
-- 2022-08-14
SELECT STR_TO_DATE('Monday, August 14, 2022', '%W,%M %e, %Y');
将字符串转换为DATETIME值
-- 2022-05-25 11:30:00
SELECT STR_TO_DATE('20220525 1130','%Y%m%d %h%i');
-- 2022-05-26 11:30:00
SELECT STR_TO_DATE('2022-05-26 11:30:00','%Y-%m-%d %H:%i:%s');
-- 2022-05-27 10:40:10
SELECT STR_TO_DATE('2022,5,27 10,40,10', '%Y,%m,%d %h,%i,%s');
STR_TO_DATE函数在根据格式字符串format解析输入字符串str时,忽略输入字符串str末尾的额外字符
-- 2022-05-25
SELECT STR_TO_DATE('25,5,2022 extra characters','%d,%m,%Y');
-- 2022-05-25 11:30:00
SELECT STR_TO_DATE('20220525 1130 extra characters','%Y%m%d %h%i');
如果输入字符串str是非法的,则STR_TO_DATE函数返回NULL
-- NULL
SELECT STR_TO_DATE('2022','%Y');
-- NULL
SELECT STR_TO_DATE('11','%h');
-- NULL
SELECT STR_TO_DATE('1130','%h%i');
-- NULL
SELECT STR_TO_DATE('113005','%h%i%s');
-- NULL
SELECT STR_TO_DATE('August,5,2017', '%M %e %Y');
-- NULL
SELECT STR_TO_DATE('Monday, August 14, 2017', '%W %M %e %Y');