Databricks SQL中将特定格式字符串转换为日期(yyyy-MM-dd)失败求助
解决日期格式转换返回NULL的问题
嘿,这个问题我之前处理过好几次!你遇到的NULL问题,本质是cast或to_date默认的日期解析格式和你的输入文本(5/30/2021 9:35:18 AM)不匹配,数据库没法识别这个字符串对应的日期,所以返回了NULL。核心思路是明确指定输入文本的日期格式模型,先让数据库正确解析成日期类型,再转换成你想要的yyyy-MM-dd格式。
下面是主流数据库的具体实现:
MySQL
用STR_TO_DATE先将字符串解析为日期时间类型,再用DATE_FORMAT输出目标格式:
SELECT DATE_FORMAT( STR_TO_DATE('5/30/2021 9:35:18 AM', '%m/%d/%Y %h:%i:%s %p'), '%Y-%m-%d' ) AS formatted_date;
- 格式符说明:
%m是两位数字月份,%d是两位数字日期,%Y是四位年份,%h是12小时制的小时,%i是分钟,%s是秒,%p匹配AM/PM标识。
PostgreSQL
可以用TO_TIMESTAMP解析字符串为时间戳,再用TO_CHAR转换格式;也可以直接用TO_DATE指定格式后转成DATE类型:
-- 方法1:转成字符串格式 SELECT TO_CHAR( TO_TIMESTAMP('5/30/2021 9:35:18 AM', 'MM/DD/YYYY HH12:MI:SS AM'), 'YYYY-MM-DD' ) AS formatted_date; -- 方法2:转成DATE类型(默认显示为yyyy-MM-dd) SELECT TO_DATE('5/30/2021 9:35:18 AM', 'MM/DD/YYYY HH12:MI:SS AM')::DATE AS formatted_date;
SQL Server
用TRY_CONVERT先安全解析为日期类型(避免解析失败报错),再用CONVERT或FORMAT输出目标格式:
-- 方法1:用CONVERT指定样式(性能更好) SELECT CONVERT(VARCHAR, TRY_CONVERT(DATETIME, '5/30/2021 9:35:18 AM', 101), 23) AS formatted_date; -- 101对应MM/DD/YYYY样式,23对应YYYY-MM-DD样式 -- 方法2:用FORMAT函数(更直观,适合小数据量) SELECT FORMAT(TRY_CONVERT(DATETIME, '5/30/2021 9:35:18 AM'), 'yyyy-MM-dd') AS formatted_date;
Oracle
用TO_DATE指定格式模型解析字符串,再用TO_CHAR输出目标格式;或者用TRUNC截断时间部分得到日期:
-- 方法1:转成字符串格式 SELECT TO_CHAR( TO_DATE('5/30/2021 9:35:18 AM', 'MM/DD/YYYY HH:MI:SS AM'), 'YYYY-MM-DD' ) AS formatted_date FROM DUAL; -- 方法2:截断时间得到DATE类型(显示为yyyy-MM-dd) SELECT TRUNC(TO_DATE('5/30/2021 9:35:18 AM', 'MM/DD/YYYY HH:MI:SS AM')) AS formatted_date FROM DUAL;
总的来说,只要你告诉数据库你的输入字符串是MM/DD/YYYY HH12:MI:SS AM这种格式,它就能正确解析,之后转换格式就很简单啦!
内容的提问来源于stack exchange,提问作者Tinkerbelle_codes
相关产品推荐
相关产品推荐

