【发布时间】:2021-11-29 22:30:42
【问题描述】:
'2021 july (JNS) Accessory Fixtures: DELIVER BETWEEN 7/26/2021 and 8/6/2021'
预期结果:
Date1 : 7/26/2021
Date2 : 8/6/2021
【问题讨论】:
标签: sql date hive substring hiveql
'2021 july (JNS) Accessory Fixtures: DELIVER BETWEEN 7/26/2021 and 8/6/2021'
预期结果:
Date1 : 7/26/2021
Date2 : 8/6/2021
【问题讨论】:
标签: sql date hive substring hiveql
例如这样:
select regexp_extract(str, '(?i)BETWEEN (\\d{1,2}/\\d{1,2}/\\d{4})',1) as date1,
regexp_extract(str, '(?i)AND (\\d{1,2}/\\d{1,2}/\\d{4})$',1) as date2
如果您需要将日期转换为正确的格式(yyyy-MM-dd),请使用 split 获取数组中的所有日期元素,使用 lpad 添加零并连接:
with mydata as (
select '2021 july (JNS) Accessory Fixtures: DELIVER BETWEEN 7/26/2021 and 8/6/2021' str
)
select concat(date1[2],'-',lpad(date1[0],2,0),'-',lpad(date1[1],2,0)) as date1,
concat(date2[2],'-',lpad(date2[0],2,0),'-',lpad(date2[1],2,0)) as date2
from
(
select split(date1,'/') date1, split(date2,'/') date2 --arrays
from
(select regexp_extract(str, '(?i)BETWEEN (\\d{1,2}/\\d{1,2}/\\d{4})',1) as date1,
regexp_extract(str, '(?i)AND (\\d{1,2}/\\d{1,2}/\\d{4})$',1) as date2
from mydata
) s
)s
结果:
date1 date2
2021-07-26 2021-08-06
如果有没有 BETWEEN 和 AND 的字符串,并且您想从字符串的开头提取第一个和第二个日期,请使用:
select regexp_extract(str, '^.*(\\d{1,2}/\\d{1,2}/\\d{4}).*(\\d{1,2}/\\d{1,2}/\\d{4})',1) as date1,
regexp_extract(str, '^.*(\\d{1,2}/\\d{1,2}/\\d{4}).*(\\d{1,2}/\\d{1,2}/\\d{4})',2) as date2
您可以通过在第二组后添加 * 来使第二个日期可选,即使字符串中不存在第二个日期,也会提取第一个日期:
select regexp_extract(str, '^.*(\\d{1,2}/\\d{1,2}/\\d{4}).*(\\d{1,2}/\\d{1,2}/\\d{4})*',1) as date1,
regexp_extract(str, '^.*(\\d{1,2}/\\d{1,2}/\\d{4}).*(\\d{1,2}/\\d{1,2}/\\d{4})',2) as date2
【讨论】: