1

我有一张包含以下数据的表格。

在此处输入图像描述

我期待需要返回的行是 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"));

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

4

3 回答 3

1

用于<比较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'))

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

于 2020-12-07T00:27:50.753 回答
0

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

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"))

足够的...?

于 2020-12-07T08:09:35.817 回答
0

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

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

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 的一个记录。

于 2020-12-07T09:27:21.087 回答