date_format()意外结果在where子句中为<=或<=

时间:2018-08-16 20:42:53

标签: hive hiveql

我们正在使用带有日期序列的内置日历表dm_reference.dim_date

select * from dm_reference.dim_date limit 10;
calendar_date  date_name, day_of_week
1999-01-01  January 1, 1999 1   5   Friday
1999-01-02  January 2, 1999 2   6   Saturday
1999-01-03  January 3, 1999 3   7   Sunday
1999-01-04  January 4, 1999 4   1   Monday
1999-01-05  January 5, 1999 5   2   Tuesday
1999-01-06  January 6, 1999 6   3   Wednesday
1999-01-07  January 7, 1999 7   4   Thursday
1999-01-08  January 8, 1999 8   5   Friday
1999-01-09  January 9, 1999 9   6   Saturday
1999-01-10  January 10, 1999    10  7   Sunday

我想对此进行过滤,使其仅包含2014年8月至当年月份之间的日期。

如果我select min(date_format(calendar_date, "YYYYMM")) from dm_reference.dim_date回来了,199901

因此,我尝试使用以下查询将我的calendar_date字段格式化为年和月,然后进行过滤以包括现在8月14日之间的日期:

select 
  distinct date_format(calendar_date, "YYYY-MMM") as year_month
  ,  date_format(calendar_date, "YYYYMM") as year_month_num -- for ordering in asc
from dm_reference.dim_date
  where date_format(calendar_date, "YYYYMM") <= 201408
    and  date_format(calendar_date, "YYYYMM") <= date_format(from_unixtime(unix_timestamp()), "YYYYMM")    
    order by year_month_num;

这将返回追溯到1999年的日期,而我希望此查询结果中最早的日期是2014年8月。

知道为什么会这样吗?如何查询我们的日历,使其仅包含过滤的日期范围?

1 个答案:

答案 0 :(得分:0)

我认为您正在使查询复杂化。您只需使用

过滤所需的日期范围
select * 
from dm_reference.dim_date
where calendar_date >= '2014-08-01' and calendar_date < trunc(current_date,'MM')

这将输出2014年8月或之后的所有日期,直到上个月底。如果您需要直到今天的数据,请将结束条件用作calendar_date <= current_date

您的查询未返回预期结果的原因是因为条件为year month of calendar_date <= '201408' and year month of calendar_date <= '201808',即201408之前的所有内容。