我需要编写一个存储过程来获取该期间的缺失数据
以下是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日之间遗漏的最新消息
添加到缺失日期列表中。另外我需要注意只有工作日获得这些日期。
非常感谢任何帮助。
答案 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;