如何生成字段等于“Dayofweek"、“weekofyear"的日期表?等;行等于从 2010-01-01 到 current_date 的日期
如何生成包含Dayofweek"、weekofyear"等字段的日期表;行等于从 2010-01-01 到 current_date 的日期如下图:
Dayofweek Dayofmonth Dayofyear Weekofmonth Weekofyear 假期2010-01-01 6 1 1 1 1 是2010-01-02 7 2 2 1 1 否2010-01-03 1 3 3 1 1 否.....2019-03-31 1 31 90 6 14 N
<块引用>
附言DayofWeek = 一周中的第几天,Sun = 1,Sat = 7Dayofmonth = 该月的第几天
Holiday是一个标志,用于区分记录是否为公众假期
所以我需要做的第一步可能是创建从 2010-01-01 到 current_date 的记录,我想知道 hive 和 mssql 中的 while 循环会做什么?然后我准备好了专栏最后将它们结合起来.
我试过了
"声明@startdate日期声明@enddate 日期设置@startdate = '2010-01-01'设置@end_date = current_date而@start_date <=end_date开始DATEADD(DAY,1,@startdate)结尾"声明@startdate 日期声明@enddate 日期设置@startdate = '2010-01-01'设置@end_date = current_date而@start_date <=end_date开始DATEADD(DAY,1,@startdate)结尾Dayofweek Dayofmonth Dayofyear Weekofmonth Weekofyear 假期2010-01-01 6 1 1 1 1 是2010-01-02 7 2 2 1 1 否2010-01-03 1 3 3 1 1 否.....2019-03-31 1 31 90 6 14 N
解决方案 Hive 解决方案:
set hivevar:start_date=2010-01-01;--替换为您的开始日期设置 hivevar:end_date=current_date;--替换为您的结束日期与 date_range 作为(--此查询生成日期范围选择 date_add ('${hivevar:start_date}',s.i) 作为 dt从(选择posexplode(split(space(datediff(${hivevar:end_date},'${hivevar:end_date},'${hivevar:start_date}')),''))作为(i,x))s),假期为(选择堆栈(5,--添加更多'01-01', '新年','01-21', '马丁路德金纪念日','02-18', '总统日','05-27', '阵亡将士纪念日','07-04', '独立日') as ( mtdt,holiday_name))选择 d.dt 作为日期,date_format(current_date,'u') 作为星期几,day(dt) 作为 dayofmonth,date_format(current_date,'D') 作为 dayofyear,date_format(current_date,'W') 作为 weekofmonth,weekofyear(dt) 作为 weekofyear,如果 h.mtdt 不为空,则 'Y' 否则 'N' 以假期结束,h.holiday_name从 date_range d在 substr(d.dt,6)= h.mtdt 上左加入假期 h;
添加更多假期.
How can i generate a Date table with fields like "Dayofweek", "weekofyear" etc ;and rows equals to date from 2010-01-01 till current_date like below:
Dayofweek Dayofmonth Dayofyear Weekofmonth Weekofyear Holiday
2010-01-01 6 1 1 1 1 Y
2010-01-02 7 2 2 1 1 N
2010-01-03 1 3 3 1 1 N
.....
2019-03-31 1 31 90 6 14 N
P.S. DayofWeek = day num of the week, Sun = 1, Sat = 7 Dayofmonth = day num of the month
Holiday is a flag to distinguish whether the records is a public holiday
So first step i need to do may be create records from 2010-01-01 till current_date, i wonder while loop in hive and mssql will do? Then I have the column ready Finally combine them.
I have tried
"Declare @startdate date
Declare @enddate date
set @startdate = '2010-01-01'
set @end_date = current_date
while @ start_date <=end_date
BEGIN
DATEADD(DAY,1,@startdate)
END
"Declare @startdate date
Declare @enddate date
set @startdate = '2010-01-01'
set @end_date = current_date
while @ start_date <=end_date
BEGIN
DATEADD(DAY,1,@startdate)
END
Dayofweek Dayofmonth Dayofyear Weekofmonth Weekofyear Holiday
2010-01-01 6 1 1 1 1 Y
2010-01-02 7 2 2 1 1 N
2010-01-03 1 3 3 1 1 N
.....
2019-03-31 1 31 90 6 14 N
解决方案
Solution for Hive:
set hivevar:start_date=2010-01-01; --replace with your start_date
set hivevar:end_date=current_date; --replace with your end_date
with date_range as
(--this query generates date range
select date_add ('${hivevar:start_date}',s.i) as dt
from ( select posexplode(split(space(datediff(${hivevar:end_date},'${hivevar:start_date}')),' ')) as (i,x) ) s
),
holiday as (
select stack(5, --add more
'01-01', 'New Year',
'01-21', 'Martin Luther King Day',
'02-18', 'Presidents Day',
'05-27', 'Memorial Day',
'07-04', 'Independence Day'
) as ( mtdt,holiday_name)
)
select d.dt as date,
date_format(current_date,'u') as dayofweek,
day(dt) as dayofmonth,
date_format(current_date,'D') as dayofyear,
date_format(current_date,'W') as weekofmonth,
weekofyear(dt) as weekofyear,
case when h.mtdt is not null then 'Y' else 'N' end as Holiday,
h.holiday_name
from date_range d
left join holiday h on substr(d.dt,6)= h.mtdt
;
Add more holidays.
相关文章