SQL如何删除STRING格式日期列的引号并转换为指定日期格式?
问题原因
- 格式模板不匹配:你给
unix_timestamp指定的格式模板"yyyy-MM-dd 00-00-00"和实际数据格式不符,实际数据双引号后的时分秒是动态值(如示例中的00-21-29),不是固定的00-00-00,无法匹配导致时间戳返回NULL,后续转换自然为空。 - 可选排查点:你的实际日期列名为
tweet_stamp,但示例SQL中写的是tweet_timestamp,如果存在列名写错的情况要先修正。 - 函数嵌套冗余:多次日期格式转换没有必要,有更简便的实现方式。
可行解决方案
以下方案均基于Hive/Spark SQL环境,其他SQL方言可对应调整函数名:
方案1:直接截取(性能最优,逻辑最简单)
如果只需要提取前10位的日期字符串,不需要校验时间合法性,直接去掉双引号后截取即可:
-- 返回字符串类型的日期,形如"2020-01-29" select substr(regexp_replace(tweet_stamp, '"', ''), 1, 10) as tweet_date from 你的表名; -- 如果需要返回date类型的结果,加一层date转换即可 select date(substr(regexp_replace(tweet_stamp, '"', ''), 1, 10)) as tweet_date from 你的表名;
方案2:标准时间格式转换
如果需要校验整条时间字符串的格式合法性,非法时间返回NULL,用正确的匹配模板转换即可:
select to_date(from_unixtime(unix_timestamp(tweet_stamp, '"yyyy-MM-dd HH-mm-ss"'))) as tweet_date from 你的表名;
模板中的HH-mm-ss会匹配动态的时分秒部分,双引号保留匹配字符串两端的引号,即可正确解析为时间戳再转成日期。
内容的提问来源于stack exchange,提问作者Jae
相关产品推荐
相关产品推荐

