zoukankan      html  css  js  c++  java
  • Sqlserver存储过程生成日期维度

    话不多说,之前已经有一篇日志是利用oracle的存储过程生成日期维度表,接下来我们就用sqlserver来实现这个操作,如下面的步骤所示

    1:创建日期维度表(Dim_time)

    USE [DW]
    GO

    /****** Object: Table [dbo].[Dim_time] Script Date: 12/19/2015 15:29:26 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[Dim_time](
    [the_date] [int] NOT NULL,
    [date_name] [nvarchar](30) NULL,
    [the_year] [int] NULL,
    [year_name] [nvarchar](30) NULL,
    [the_quarter] [int] NULL,
    [quarter_name] [nvarchar](30) NULL,
    [the_month] [int] NULL,
    [month_name] [nvarchar](30) NULL,
    [the_week] [int] NULL,
    [week_name] [nvarchar](30) NULL,
    [week_day] [int] NULL,
    [week_day_name] [nvarchar](30) NULL,
    CONSTRAINT [PK_Dim_time] PRIMARY KEY CLUSTERED
    (
    [the_date] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    2:创建生成日期维表数据的存储过程

    USE [DW]
    GO
    /****** Object: StoredProcedure [dbo].[SP_CREATE_TIME_DIMENSION] Script Date: 12/20/2015 12:51:17 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER PROCEDURE [dbo].[SP_CREATE_TIME_DIMENSION]
    @begin_date nvarchar(50)='2014-07-01' ,
    @end_date nvarchar(50)='2015-12-31'
    as

    /*
    SP_CREATE_TIME_DIMENSION: 生成时间维数据
    begin_date: 起始时间
    end_date:结束时间
    */
    declare
    @dDate date=convert(date,@begin_date),
    @v_the_date varchar(10),
    @v_the_year varchar(4),
    @v_the_quarter varchar(2),
    @v_the_month varchar(10),
    @v_the_month2 varchar(2),
    @v_the_week varchar(2),
    @v_the_day varchar(10),
    @v_the_day2 varchar(2),
    @v_week_day nvarchar(10),
    @adddays int=1;
    WHILE (@dDate<=convert(date,@end_date))
    begin
    set @v_the_date=convert(char(10),@dDate,112);--key值
    set @v_the_year=DATEPART("YYYY",@dDate);--年
    set @v_the_quarter=DATEPART("QQ",@dDate);--季度"
    set @v_the_month=DATEPART("MM",@dDate);--月份(字符型)
    --set @v_the_month2=to_number(to_char(dDate, 'mm'));--月份(数字型)
    set @v_the_day=DATEPART("dd",@dDate);--日(字符型)
    --set @v_the_day2=to_char(dDate, 'dd');
    set @v_the_week=DATEPART("WW",@dDate);--年的第几周
    set @v_week_day=DATEPART("DW",@dDate); --星期几
    insert into Dim_time(the_date,date_name,the_year,year_name,the_quarter,quarter_name,the_month,month_name,the_week,week_name,week_day,week_day_name)
    values(
    @v_the_date,
    convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_month)+'月'+convert(nvarchar(10),@v_the_day)+'日',
    @v_the_year,
    convert(nvarchar(10),@v_the_year)+'年',
    @v_the_quarter,
    convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_quarter)+'季度',
    case when @v_the_month>=10 then
    convert(int,(convert(nvarchar(10),@v_the_year)+convert(nvarchar(10),@v_the_month)))
    else convert(int,convert(nvarchar(10),@v_the_year)+'0'+convert(nvarchar(10),@v_the_month)) end,
    convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_month)+'月',
    @v_the_week
    ,'第'+convert(nvarchar(10),@v_the_week)+'周',
    @v_week_day,
    case @v_week_day-1
    when 1 then '星期一'
    when 2 then '星期二'
    when 3 then '星期三'
    when 4 then '星期四'
    when 5 then '星期五'
    when 6 then '星期六'
    when 0 then '星期日'
    else '' end
    );
    set @dDate=dateadd(day,@adddays,@dDate);
    continue
    if @dDate=dateadd(day,-1,convert(date,@end_date))
    break
    end

    3:执行存储过程

    USE [DW]
    GO
    
    DECLARE    @return_value int
    
    EXEC    @return_value = [dbo].[SP_CREATE_TIME_DIMENSION]
    
    SELECT    'Return Value' = @return_value
    
    GO

    4:查看2015年12月份的维度表内容如下图所示,大功告成

    5:注意和扩展

        a:可以根据思路运用到各种数据库当中,例如本文就是根据oracle的procedure改造过来的

        b:注意上表中的最后一个字段week_day星期几的字段,星期一 至 星期天依次为 2,3,4,5,6,7,1

  • 相关阅读:
    PHP 大小写转换、首字母大写、每个单词首字母大写转换相关函数
    【论文学习4】BiSample: Bidirectional Sampling for Handling Missing Data with Local Differential Privacy
    【论文学习3】Local Differential Privacy for Deep Learning
    【论文学习2】 Differential Privacy Reinforcement Learning
    深度学习中的优化算法
    Spatial crowdsourcing
    “pip install tensorflow ”出现错误
    python或pip'不是内部或外部命令”
    pip install torch出现错误
    打不开gitHub的解决方法
  • 原文地址:https://www.cnblogs.com/wxjnew/p/5057713.html
Copyright © 2011-2022 走看看