查找日期 before/after 以 int 表示形式存储的日期 (Hive SQL)
Finding the date before/after a date stored in int representation (Hive SQL)
我需要 select 在以特定日期为中心的一系列日期之间,但我的日期分区列存储为 int。
例如,select介于“20210901”之前和之后的日期(20210831 到 20210902)
有没有比我下面想出的方法更简单的方法?
between cast(date_format(date_sub(date_format(from_unixtime(unix_timestamp(cast('20210901' as string),'yyyyMMdd')),'yyyy-MM-dd'),1),'yyyyMMdd') as int) and \
cast(date_format(date_add(date_format(from_unixtime(unix_timestamp(cast('20210901' as string),'yyyyMMdd')),'yyyy-MM-dd'),1),'yyyyMMdd');
unix_timestamp + from_unixtime 仅当您有一些日期格式无法仅使用字符串函数转换为 yyyy-MM-dd 格式时才需要转换,例如 1 Jan 21
。 unix_timestamp 和 from_unixtime 下使用的 SimpleDateFormat class 相当沉重,一点也不简单,甚至 regexp_replace 也更容易转换。
尽可能使用字符串操作:
select part_col between int(replace(date_sub(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-',''))
and int(replace(date_add(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-',''))
连Int()
转换都不需要,Hive会隐式转换:
select part_col between replace(date_sub(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-','')
and replace(date_add(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-','')
如果你能提供日期格式的参数yyyy-MM-dd
,那就更简单了:
select part_col between replace(date_sub('2021-09-01',1),'-','')
and replace(date_add('2021-09-01',1),'-','')
你那里的步骤似乎太多了。
我认为这应该让你到达那里。仍然不是很漂亮,但对我来说确实更清楚了。
WHERE
from_Unixtime(unix_timestamp(cast (<integer date column> as string),'yyyyMMdd'), 'yyyy-MM-dd') BETWEEN
date_add( from_Unixtime(unix_timestamp(cast (20210901 as string),'yyyyMMdd'), 'yyyy-MM-dd') ,-1) AND
date_add( from_Unixtime(unix_timestamp(cast (20210901 as string),'yyyyMMdd'), 'yyyy-MM-dd') ,-1)
我需要 select 在以特定日期为中心的一系列日期之间,但我的日期分区列存储为 int。
例如,select介于“20210901”之前和之后的日期(20210831 到 20210902)
有没有比我下面想出的方法更简单的方法?
between cast(date_format(date_sub(date_format(from_unixtime(unix_timestamp(cast('20210901' as string),'yyyyMMdd')),'yyyy-MM-dd'),1),'yyyyMMdd') as int) and \
cast(date_format(date_add(date_format(from_unixtime(unix_timestamp(cast('20210901' as string),'yyyyMMdd')),'yyyy-MM-dd'),1),'yyyyMMdd');
unix_timestamp + from_unixtime 仅当您有一些日期格式无法仅使用字符串函数转换为 yyyy-MM-dd 格式时才需要转换,例如 1 Jan 21
。 unix_timestamp 和 from_unixtime 下使用的 SimpleDateFormat class 相当沉重,一点也不简单,甚至 regexp_replace 也更容易转换。
尽可能使用字符串操作:
select part_col between int(replace(date_sub(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-',''))
and int(replace(date_add(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-',''))
连Int()
转换都不需要,Hive会隐式转换:
select part_col between replace(date_sub(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-','')
and replace(date_add(regexp_replace('20210901','^(\d{4})(\d{2})(\d{2})$','--'),1),'-','')
如果你能提供日期格式的参数yyyy-MM-dd
,那就更简单了:
select part_col between replace(date_sub('2021-09-01',1),'-','')
and replace(date_add('2021-09-01',1),'-','')
你那里的步骤似乎太多了。 我认为这应该让你到达那里。仍然不是很漂亮,但对我来说确实更清楚了。
WHERE
from_Unixtime(unix_timestamp(cast (<integer date column> as string),'yyyyMMdd'), 'yyyy-MM-dd') BETWEEN
date_add( from_Unixtime(unix_timestamp(cast (20210901 as string),'yyyyMMdd'), 'yyyy-MM-dd') ,-1) AND
date_add( from_Unixtime(unix_timestamp(cast (20210901 as string),'yyyyMMdd'), 'yyyy-MM-dd') ,-1)