根据 eff 和 exp 日期对 return 单行进行 Hive 查询

Hive query to return single row based on eff and exp date

我有一个 table 包含以下数据。

我希望需要返回的行是 exp_dt“2020-09-22”。但是当下面的 运行 查询时,它返回两行。我不明白为什么它在具有 eff_dt“2020-09-19”时也返回第一行。

select id,cd,eff_dt,exp_dt,post_dt from table 
where from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) >= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"));

我的查询有问题吗?我期待返回第二行。

使用 <exp_date 进行比较:

select id,cd,eff_dt,exp_dt,post_dt
from table 
where from_unixtime(unix_timestamp('2020-09-21', 'yyyy-MM-dd')) >= from_unixtime(unix_timestamp(eff_dt, 'yyyy-MM-dd')) and
      from_unixtime(unix_timestamp('2020-09-22', 'yyyy-MM-dd')) < from_unixtime(unix_timestamp(exp_dt, 'yyyy-MM-dd'))

我把比较顺序颠倒了。我发现先用常量来遵循逻辑更容易。

这是否捕捉了同一天到期的边缘情况并同时解决了您的问题?

select id,cd,eff_dt,exp_dt,post_dt from table 
where 
    (from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
     and
     from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) > from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
    )
    or
    (from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) = from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
     and
     from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) = from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
    )
;

事实上我怀疑 exp 总是 >= eff,所以可能只有一个条件

from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))

够了...?

您不需要 from_unixtime(unix_timestamp()),因为日期已经是正确的格式并且参数是相同的 yyyy-MM-dd 格式。

您查询中的问题是您对 eff 和 exp 日期都使用了 equal 要查找日期的最新记录,请使用此查询:

select id,cd,eff_dt,exp_dt,post_dt from table 
where eff_dt <= "2020-09-21"
  and exp_dt >  "2020-09-21";

当SCD2中eff_dt = exp_dt时,如果你只有日期(没有时间成分),应该没有记录。只有当你使用时间戳时,日期才能相等,而时间不同,在这种情况下,在检查之前将你的参数日期转换为时间戳。

SCD2 的设计应该使事实记录可以映射到 SCD2 的一条记录。