SQL中多格式日期统一标准化:TRY_CAST转换部分日期返回NULL
解决多格式日期统一转换问题
你的日期列包含两种格式:
- 英文月份缩写格式:
"Jul 28 2023 3:16PM"(带双空格) - 标准ISO格式:
"2022-09-29 11:30:00"
TRY_CAST无法自动解析第一种格式,导致转换结果为NULL。以下是不同SQL方言的解决方案:
SQL Server
方法1:使用TRY_PARSE(推荐,支持更多格式)
TRY_PARSE依赖.NET的日期解析规则,能直接识别英文月份+AM/PM的格式,包括双空格:
SELECT TRY_PARSE(your_date_column AS DATETIME USING 'en-US') AS standardized_date FROM your_table;
方法2:替换空格后用TRY_CONVERT
先将双空格替换为单空格,再用对应格式代码转换,同时兼容ISO格式:
SELECT TRY_CONVERT(DATETIME, REPLACE(your_date_column, ' ', ' '), 100) AS standardized_date FROM your_table;
格式代码100对应mon dd yyyy hh:miAM/PM格式,TRY_CONVERT会自动匹配ISO格式的日期。
MySQL
方法1:CASE WHEN分支转换
通过判断日期字符串特征,分别调用对应格式的STR_TO_DATE:
SELECT CASE WHEN your_date_column LIKE '%AM' OR your_date_column LIKE '%PM' THEN STR_TO_DATE(your_date_column, '%b %d %Y %h:%i%p') ELSE STR_TO_DATE(your_date_column, '%Y-%m-%d %H:%i:%s') END AS standardized_date FROM your_table;
方法2:弹性匹配(MySQL 8.0.19+)
利用STR_TO_DATE的%通配符忽略任意空格,同时兼容两种格式:
SELECT IFNULL( STR_TO_DATE(your_date_column, '%b %d %Y %h:%i%p'), STR_TO_DATE(your_date_column, '%Y-%m-%d %H:%i:%s') ) AS standardized_date FROM your_table;
PostgreSQL
使用TO_TIMESTAMP函数,指定对应格式匹配英文月份格式,同时自动兼容ISO格式:
SELECT TO_TIMESTAMP(your_date_column, 'Mon DD YYYY HH12:MIAM') AS standardized_date FROM your_table;
如果需要更严谨的分支判断:
SELECT CASE WHEN your_date_column ~* '^\w{3} \d{2} \d{4} \d{1,2}:\d{2}[AP]M$' THEN TO_TIMESTAMP(your_date_column, 'Mon DD YYYY HH12:MIAM') ELSE TO_TIMESTAMP(your_date_column, 'YYYY-MM-DD HH24:MI:SS') END AS standardized_date FROM your_table;
内容的提问来源于stack exchange,提问作者abhishek wasnik
相关产品推荐
相关产品推荐

