Hi-iam正在尝试使用regex函数从字符串中提取日期。如何在日期格式从mm/dd/yyyy更改为mm/dd/yy时动态提取日期。下面的regexp适用于mm/dd/yyyy格式。如果我的字符串同时具有这两种格式,并且我想动态提取日期,该怎么办。
string1="2021航班5附件固定装置:在2021年7月25日至2021年8月7日之间交付"以下功能正常工作。
string1="2021航班5附件固定装置:在7/25/21和8/7/21之间交付"如何在两种情况下提取if 2日期。
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
使用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在评论中提到,这种猜测可能存在错误。