比较全的时间日期维表sql

--日期维表基本信息
       with  tmp_es_date_00 as 
       (
        select  
        regexp_replace(predict_date_day,'-','')                                                           as date_id             -- 日(yyyymmdd)
       ,predict_date_day                                                                                  as date_code           -- 日(yyyy-mm-dd)      
	   ,concat(year(predict_date_day),'年',month(predict_date_day),'月',day(predict_date_day),'日')                                   as date_name           -- 日(yyyy年mm月dd日)
	   ,dayofweek(predict_date_day)                                                                       as week_day_id         -- 周ID(周几)
	   ,case dayofweek(predict_date_day)  when 1 then '星期日' when 2 then '星期一' 
                            	   when 3 then '星期二' when 4 then '星期三' 
                                   when 5 then '星期四' when 6 then '星期五' 
                                   when 7 then '星期六' end                                 as week_day_name       -- 星期(星期几)
	   ,concat(year(predict_date_day),case when weekofyear(predict_date_day) < 10 then concat('0',(weekofyear(predict_date_day))) else weekofyear(predict_date_day) end)	as week_ofyearid -- 年周的id
	   ,weekofyear(predict_date_day)                                                                      as week_ofyear         -- 年周
	   ,concat(year(predict_date_day),'年第',weekofyear(predict_date_day),'周')                                         as week_ofyear_name    -- 年周名称
	   ,concat(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),
	   '~',date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end))  as week_ofyear_period  -- 年周段
	   ,concat(
	    regexp_replace(substr(split(concat(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),
	   '~',date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end)), '~') [0], 6, 5),'-','.'),
         '-',
        regexp_replace(substr(split(concat(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),
	   '~',date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end)), '~') [1], 6, 5),'-','.')
        )                                                                                   as week_ofyear_period_short     --年周段
	 --,dense_rank()over(partition by year(predict_date_day),month(predict_date_day) order by weekofyear(predict_date_day) asc)       as week_ofmonth        -- 月周
	 --,concat(month(predict_date_day),'月第',dense_rank()over(partition by year(predict_date_day),month(predict_date_day) order by weekofyear(predict_date_day) asc),'周') as week_ofmonth_name   -- 月周名称  
	   ,month(predict_date_day)                                                                           as month_code          -- 月(mm)
	   ,substr(regexp_replace(predict_date_day,'-','') ,1,6)                                              as yearmonth_id        -- 年月(yyyymm)
	   ,quarter(predict_date_day)                                                                         as quarter_id          -- 季度
       ,concat(year(predict_date_day),'Q',quarter(predict_date_day) )                                                   as quarter_code        -- 年季度
       ,year(predict_date_day)                                                                            as year_id             -- 年
       ,case when MONTH(predict_date_day) > 6 then 'f_half' else 'l_half' end                             as half_code           -- 半年
	   ,regexp_replace(date_add(predict_date_day,-1),'-','')                                             as last_date_id        -- 昨天
	   ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),'-','')      as last_sunday          -- 上个周日 1
	   ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 14 else dayofweek(predict_date_day) + 6 end),'-','')     as L_last_sunday        -- 上上个周日 2 
       ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 21 else dayofweek(predict_date_day) + 13 end),'-','')    as LL_last_sunday       -- 上上上个周日 3 
       ,regexp_replace(date_add(predict_date_day,0 - case when dayofweek(predict_date_day) = 1 then 28 else dayofweek(predict_date_day) + 20 end),'-','')    as LLL_last_sunday      -- 上上上上个周日 4
	   ,regexp_replace(date_add(trunc(predict_date_day,'MM'),-1),'-','')                                                         as lastday_of_lastmonth -- 上个月末
	   ,regexp_replace(date_add(trunc(predict_date_day,'YY'),-1),'-','')                                                         as lastday_oflastyear   -- 上个年末  
	   ,regexp_replace(date_add(predict_date_day,1 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),'-','')      as firstday_ofweek      -- 当周第一天
	   ,regexp_replace(date_add(predict_date_day,7 - case when dayofweek(predict_date_day) = 1 then 7 else dayofweek(predict_date_day) - 1 end),'-','')      as lastday_ofweek       -- 当周最后一天  
	   ,trunc(predict_date_day,'MM')															            as firstday_ofmonth    -- 当月第一天
	   ,last_day(predict_date_day)                                                                        as lastday_ofmonth     -- 当月最后一天
	   ,to_date(concat(year(predict_date_day),'-',lpad(ceil(month(predict_date_day)/3) * 3-2,2,0),'-01'))               as firstday_ofseason   -- 当季第一天
	   ,last_day(to_date(concat(year(predict_date_day),'-',lpad(ceil(month(predict_date_day)/3) * 3,2,0),'-01')))       as lastday_ofseason    -- 当季最后一天
	   ,trunc(predict_date_day,'YY')                                                                      as firstday_ofyear     -- 当年第一天
	   ,last_day(add_months(trunc(predict_date_day,'YY'),11))                                             as lastday_ofyear      -- 当年最后一天
   from(
         select
           date_add("2020-01-14", t.pos) as predict_date_day
         from(
             select
               posexplode(
                 split(
                   repeat(
                     "m",
                     --datediff(
                     --  date_sub(from_unixtime(unix_timestamp('21001231', 'yyyyMMdd')),-1),
                    --            from_unixtime(unix_timestamp('19000101', 'yyyyMMdd'),'yyyy-MM-dd')
                    -- )
					datediff("2030-01-13", "2020-01-14")
                   ),"m"
                 )
               )
           ) t
      ) T 
      )
	  
	  
	   --更新月周
      --[dim][房产业务][时间维表]dim_es_date_c_d 	   
	  -- insert overwrite  table  dim_es_date_c_d
       select 	   
	          M.date_id                                          --日(yyyymmdd)           
	         ,M.date_code                                        --日(yyyy-mm-dd)
	         ,M.date_name                                        --日(yyyy年mm月dd日)
             ,M.week_day_id                                      --周ID(周几)
	         ,M.week_day_name                                    --星期(星期几)
             ,N.week_ofyearid                                    --年周的id			 
	         ,M.week_ofyear                                      --年周               
	         ,N.week_ofyear_name                                 --年周名称 
	         ,M.week_ofyear_period                               --年周段     
	         ,M.week_ofyear_period_short                         --年周段简称 
			 ,N.month_code as  month_week_code                   --周所在月 
        --     ,dense_rank()over(partition by M.year_id,N.month_code order by M.week_ofyear asc)  as week_ofmonth                                       --月周
        	 ,dense_rank()over(partition by N.year_id,N.month_code order by N.week_ofyear asc)  as week_ofmonth                                       --月周
			 ,concat(N.month_code,'月第',dense_rank()over(partition by N.year_id,N.month_code order by N.week_ofyear asc),'周') as week_ofmonth_name  --月周名称
	         ,M.month_code                                       --月(mm)         
	         ,M.yearmonth_id                                     --年月(yyyymm)            
	         ,M.quarter_id                                       --季度              
	         ,M.quarter_code                                     --年季度            
	         ,M.year_id                                          --年                  
	         ,M.half_code                                        --半年
             ,M.last_date_id                                     --昨天
			 ,M.last_sunday                                      --上个周日
			 ,M.L_last_sunday                                    --上上个周日
             ,M.LL_last_sunday                                   --上上个周日
             ,M.LLL_last_sunday                                  --上上上个周日
			 ,M.lastday_of_lastmonth                             --上个月末
			 ,M.lastday_oflastyear                               --上个年末 	 
	         ,M.firstday_ofweek                                  --当周第一天          
	         ,M.lastday_ofweek                                   --当周最后一天           
	         ,M.firstday_ofmonth                                 --当月第一天          
	         ,M.lastday_ofmonth                                  --当月最后一天       
	         ,M.firstday_ofseason                                --当季第一天        
	         ,M.lastday_ofseason                                 --当季最后一天         
	         ,M.firstday_ofyear                                  --当年第一天          
	         ,M.lastday_ofyear                                   --当年最后一天 
             ,from_utc_timestamp(current_timestamp(),"GMT+8")  as last_update_time				 
        from  tmp_es_date_00 M
        left join 
		(
	    select  year_id
	           ,month_code        
	           ,week_ofyear
          	   ,week_ofyear_period
               ,week_ofyearid
               ,week_ofyear_name
	           ,count(date_id) day_cnt            
	    from  tmp_es_date_00
	    group by year_id
	            ,month_code        
	            ,week_ofyear
          		,week_ofyear_period
                ,week_ofyearid
                ,week_ofyear_name
	    having 	day_cnt >= 4
		) N                           -- 统计周所在月
	--	on M.year_id = N.year_id and M.week_ofyear = N.week_ofyear 
    	on M.week_ofyear_period = N.week_ofyear_period
    --    where M.date_id <= 	'${yyyyMMdd}'
		where M.date_code <=	date_add(from_unixtime(unix_timestamp('${yyyyMMdd}', 'yyyyMMdd'),'yyyy-MM-dd'),1)
	  ;
	  
	  
	  
	  --
	  CREATE TABLE `dim_es_date_c_d`(
`day_code` string COMMENT '',
`day_long_desc` string COMMENT '',
`day_medium_desc` string COMMENT '',
`day_short_desc` string COMMENT '',
`week_code` string COMMENT '',
`week_long_desc` string COMMENT '',
`week_medium_desc` string COMMENT '',
`week_short_desc` string COMMENT '',
`week_day` string COMMENT '',
`month_code` string COMMENT '',
`month_long_desc` string COMMENT '',
`month_medium_desc` string COMMENT '',
`month_short_desc` string COMMENT '',
`quarter_code` string COMMENT '',
`quarter_long_desc` string COMMENT '',
`quarter_medium_desc` string COMMENT '',
`quarter_short_desc` string COMMENT '',
`half_year_code` string COMMENT '',
`half_long_desc` string COMMENT '',
`half_medium_desc` string COMMENT '',
`half_short_desc` string COMMENT '',
`year_code` string COMMENT '',
`year_long_desc` string COMMENT '',
`year_medium_desc` string COMMENT '',
`year_short_desc` string COMMENT '',
`last_update_time` string COMMENT '')
COMMENT '时间维表'

你可能感兴趣的:(hive数据仓库,sql,数据库,database)