我们正在使用带有日期序列的内置日历表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月。
知道为什么会这样吗?如何查询我们的日历,使其仅包含过滤的日期范围?
答案 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
之前的所有内容。