查找日期 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)