存储过程以查找日期范围的缺失数据

时间:2014-10-23 17:33:21

标签: sql-server

我需要编写一个存储过程来获取该期间的缺失数据

以下是Storedprocedure的输入

@yearDisplayStart
@quarterDisplayStart
@monthDisplayStart
@weekDisplayStart
@runDate

例如,我需要查看yearDisplayStart和quarterDisplayStart之间的数据是否可用,然后是quarterDisplayStart和monthDisplayStart,然后是monthDisplayStart和weekDisplayStart,然后是weekDisplayStart和runDate,并返回每个范围内的缺失数据。

runDate - 08/22/2014

yearDisplayStart 2014年1月15日 - 2014年8月22日 quarterDisplayStart 2014年7月1日 - 2014年8月22日 monthDisplayStart 08/21/2014 - 2014年8月22日

了解2014年1月15日至2014年7月1日之间遗漏的内容 了解2014年7月1日至2014年8月21日之间遗漏的最新消息

添加到缺失日期列表中。另外我需要注意只有工作日获得这些日期。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建一个包含生成日期列表的表(例如+/- 50年),然后选择反对,或者更确切地说是加入。

e.g。从这里:http://michaelmorley.name/how-to/create-date-dimension-table-in-sql-server

您可以生成如下表格:

/** Create Date Dimension Table **/
/* Create First numbers table for key generation */
CREATE TABLE Numbers_Small (Number INT);

INSERT INTO Numbers_Small
VALUES (0)
    ,(1)
    ,(2)
    ,(3)
    ,(4)
    ,(5)
    ,(6)
    ,(7)
    ,(8)
    ,(9);
GO

/* Create Second numbers table for key generation */
CREATE TABLE Numbers_Big (Number_Big BIGINT);

INSERT INTO Numbers_Big (Number_Big)
SELECT (tenthousands.number * 10000 + thousands.number * 1000 + hundreds.number * 100 + tens.number * 10 + ones.number) AS number_big
FROM numbers_small tenthousands
    ,numbers_small thousands
    ,numbers_small hundreds
    ,numbers_small tens
    ,numbers_small ones;
GO

/* Create Date Dimension Table */
CREATE TABLE [dbo].[DimDate] (
    [DateKey] [int] NOT NULL
    ,[Date] [datetime] NOT NULL
    ,[Day] [char](10) NULL
    ,[DayOfWeek] [smallint] NULL
    ,[DayOfMonth] [smallint] NULL
    ,[DayOfYear] [smallint] NULL
    ,[PreviousDay] [datetime] NULL
    ,[NextDay] [datetime] NULL
    ,[WeekOfYear] [smallint] NULL
    ,[Month] [char](10) NULL
    ,[MonthOfYear] [smallint] NULL
    ,[QuarterOfYear] [smallint] NULL
    ,[Year] [int] NULL
    );
GO

/* Create Date Key and Date Fields */
INSERT INTO [DimDate] (
    DateKey
    ,DATE
    )
SELECT number_big
    ,DATEADD(day, number_big, '1900-01-01') AS DATE
FROM numbers_big
WHERE DATEADD(day, number_big, '1900-01-01') BETWEEN '1900-01-01'
        AND '2030-12-31'
ORDER BY number_big;
GO

/* Update all other fields with appropriate data. */
UPDATE [DimDate]
SET Day = DATENAME(DW, DATE)
    ,DayOfWeek = DATEPART(WEEKDAY, DATE)
    ,DayOfMonth = DAY(DATE)
    ,DayOfYear = DATEPART(DY, DATE)
    ,PreviousDay = DATEADD(DAY, - 1, DATE)
    ,NextDay = DATEADD(DAY, 1, DATE)
    ,WeekOfYear = DATEPART(WK, DATE)
    ,Month = DATENAME(MONTH, DATE)
    ,MonthOfYear = MONTH(DATE)
    ,QuarterOfYear = DATEPART(Q, DATE)
    ,Year = YEAR(DATE);
GO

/* Drop Temp Tables */
DROP TABLE Numbers_Small;

DROP TABLE Numbers_Big;