嗨,iam试图从字符串中提取日期,当日期格式从mm/dd/yyyy变为mm/dd/yy时,使用regex function.How动态提取日期。下面的regexp适用于mm/dd/yyyy format.What,如果我的字符串具有这两种格式,并且我想动态提取日期。
string1 = '2021航班5航班附件:在7/25/2021和8/7/2021之间交付功能良好。
string1 =‘2021年航班5附件夹具:在7/25/21和8/7/21之间交付,如何在这两种情况下提取两个日期。
regexp_extract(string1, '^.*(\\d{1,2}/\\d{1,2}/\\d{4}).*(\\d{1,2}/\\d{1,2}/\\d{4})',1) date1,
regexp_extract(string1, '^.*(\\d{1,2}/\\d{1,2}/\\d{4}).*(\\d{1,2}/\\d{1,2}/\\d{4})',2) date2发布于 2022-01-27 12:59:08
用CASE表达式检查不同的格式并进行相应的解析。两位数年份是一种糟糕的做法,但是如果您已经有了这样的数据,那么就没有什么可做的了,这是解析不同格式的常用方法-- CASE表达式:
演示:
with mytable as (
select '2021 Flight 5 Accessory Fixtures: DELIVER BETWEEN 7/25/2021 and 8/7/2021' string1 union all
select '2021 Flight 5 Accessory Fixtures: DELIVER BETWEEN 7/25/21 and 8/7/21'
)
select case when string1 rlike '(?i)BETWEEN (\\d{1,2}/\\d{1,2}/\\d{4})'
then date(from_unixtime (unix_timestamp(regexp_extract(string1, '(?i)BETWEEN (\\d{1,2}/\\d{1,2}/\\d{4})',1),'MM/dd/yyyy')
))
when string1 rlike '(?i)BETWEEN \\d{1,2}/\\d{1,2}/\\d{2} '
then date(from_unixtime (unix_timestamp(regexp_extract(string1, '(?i)BETWEEN (\\d{1,2}/\\d{1,2}/\\d{2})',1),'MM/dd/yy')
))
end date1,
case when string1 rlike '(?i)AND (\\d{1,2}/\\d{1,2}/\\d{4})'
then date(from_unixtime (unix_timestamp(regexp_extract(string1, '(?i)AND (\\d{1,2}/\\d{1,2}/\\d{4})',1),'MM/dd/yyyy')
))
when string1 rlike '(?i)AND \\d{1,2}/\\d{1,2}/\\d{2}'
then date(from_unixtime (unix_timestamp(regexp_extract(string1, '(?i)AND (\\d{1,2}/\\d{1,2}/\\d{2})',1),'MM/dd/yy')
))
end date2
from mytable结果:
date1 date2
2021-07-25 2021-08-07
2021-07-25 2021-08-07对于两位数年份,unix_timestamp函数将猜测缺失数字: 7/25/21被解析为2021-07-25,7/25/98被解析为1998-07-25。这种猜测可能有错误,@PanagiotisKanavos在评论中提到了这一点。
https://stackoverflow.com/questions/70877491
复制相似问题