MySQL STR_TO_DATE如何避免两位年份歧义,实现严格格式校验
严格校验MySQL日期字符串为DD/MM/YYYY格式(强制四位年份)
MySQL的STR_TO_DATE在使用%Y格式符时,默认会宽松处理两位年份并自动补全(00-69转为2000-2069,70-99转为1970-1999),这导致无法直接通过STR_TO_DATE(date_str, '%d/%m/%Y')强制校验四位年份。要实现严格校验,可通过以下两种方法:
方法1:正则表达式+日期有效性校验
先通过正则确保字符串格式完全符合DD/MM/YYYY(年份必须为四位),再验证日期本身的合法性:
SELECT CASE WHEN date_column REGEXP '^[0-9]{2}/[0-9]{2}/[0-9]{4}$' AND STR_TO_DATE(date_column, '%d/%m/%Y') IS NOT NULL THEN STR_TO_DATE(date_column, '%d/%m/%Y') ELSE NULL END AS validated_date FROM your_table;
- 正则
^[0-9]{2}/[0-9]{2}/[0-9]{4}$确保字符串是两位数字日、两位数字月、四位数字年的组合 STR_TO_DATE进一步验证日期的合法性(比如拒绝31/04/2024这类无效日期)
方法2:反向格式匹配校验
利用DATE_FORMAT将转换后的日期转回字符串,对比是否与原字符串完全一致:
SELECT CASE WHEN STR_TO_DATE(date_column, '%d/%m/%Y') IS NOT NULL AND DATE_FORMAT(STR_TO_DATE(date_column, '%d/%m/%Y'), '%d/%m/%Y') = date_column THEN STR_TO_DATE(date_column, '%d/%m/%Y') ELSE NULL END AS validated_date FROM your_table;
- 若原字符串是两位年份(如
21/02/24),STR_TO_DATE会自动补全为2024-02-21,再用DATE_FORMAT转回%d/%m/%Y格式会得到21/02/2024,与原字符串不一致,因此返回NULL - 该方法同时也能过滤掉格式合法但日期无效的字符串
内容的提问来源于stack exchange,提问作者Sergio M
相关产品推荐
相关产品推荐

