接受开始日期和从开始日期开始的连续日期数的存储过程
Stored procedure to accept starting date and number of consecutive dates beginning from start date
该参数应考虑,一个开始日期和以该开始日期开始的连续日期的数量。
存储过程然后应根据提供的两个参数填充 DateRange table 的所有列。
我创建了一个 table :
CREATE TABLE DateRange
(
DateID INT IDENTITY,
DateValue DATE,
Year INT,
Quarter INT,
Month INT,
DayOfWeek INT
);
存储过程代码:
CREATE FUNCTION dbo.DateRange_sp4
(@StartDate DATE,
@NumberofConsecutivedays INT)
RETURNS @DateList TABLE
(
DateID INT,
DateValue DATE,
Year INT,
Quarter INT,
Month INT,
DayOfWeek INT
)
AS
BEGIN
DECLARE @Counter INT = 0;
WHILE (@Counter < @NumberofConsecutivedays)
BEGIN
INSERT INTO @DateList
VALUES (@Counter + 1,
DATEADD(DAY, @Counter, @StartDate),
DATEPART(YEAR, @StartDate),
DATEPART(QUARTER, @StartDate),
DATEPART(MONTH, @StartDate),
DatePart(WEEKDAY, @StartDate) );
SET @Counter += 1
END
RETURN;
END
GO
SELECT *
FROM dbo.DateRange_sp4('2018-07-13', 20);
我的输出 returns 年、季度、月和星期几的结果相同。如何拆分不同列中的日期?或者还有其他方法吗?
每次迭代循环时,您都为 @StartDate 使用了相同的值。
假设您想要示例输出中每个日期的日期部分,在循环结束时您应该更新@StartDate 的值。
INSERT INTO @DateList
VALUES(@Counter + 1, DATEADD(day,@Counter, @StartDate), DATEPART(year, @StartDate), DATEPART(QUARTER, @StartDate),DATEPART(month, @StartDate), DatePart(WEEKDAY,@StartDate)) ;
SET @StartDate = DATEADD(day,@Counter + 1, @StartDate);
SET @Counter +=1;
使用计数table...它会快很多。检查 10K 天...和 运行 你的循环代码 10K 天。
declare @dateparameter date = '1900-04-12'
declare @numOfDays int = 10000
;WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select
datevalue = @dateparameter
,year = datepart(year,@dateparameter)
,quarter = datepart(quarter,@dateparameter)
,month = datepart(month,@dateparameter)
,dayofweek = datepart(weekday,@dateparameter)
union all
select
datevalue = dateadd(day,N,@dateparameter)
,year = datepart(year,dateadd(day,N,@dateparameter))
,quarter = datepart(quarter,dateadd(day,N,@dateparameter))
,month = datepart(month,dateadd(day,N,@dateparameter))
,dayofweek = datepart(weekday,dateadd(day,N,@dateparameter))
from cteTally
where N <= @numOfDays
但是,如果您要经常引用它,为什么不坚持 table? Aaron Bertran 对此有一篇很棒的文章:
https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/
该参数应考虑,一个开始日期和以该开始日期开始的连续日期的数量。
存储过程然后应根据提供的两个参数填充 DateRange table 的所有列。
我创建了一个 table :
CREATE TABLE DateRange
(
DateID INT IDENTITY,
DateValue DATE,
Year INT,
Quarter INT,
Month INT,
DayOfWeek INT
);
存储过程代码:
CREATE FUNCTION dbo.DateRange_sp4
(@StartDate DATE,
@NumberofConsecutivedays INT)
RETURNS @DateList TABLE
(
DateID INT,
DateValue DATE,
Year INT,
Quarter INT,
Month INT,
DayOfWeek INT
)
AS
BEGIN
DECLARE @Counter INT = 0;
WHILE (@Counter < @NumberofConsecutivedays)
BEGIN
INSERT INTO @DateList
VALUES (@Counter + 1,
DATEADD(DAY, @Counter, @StartDate),
DATEPART(YEAR, @StartDate),
DATEPART(QUARTER, @StartDate),
DATEPART(MONTH, @StartDate),
DatePart(WEEKDAY, @StartDate) );
SET @Counter += 1
END
RETURN;
END
GO
SELECT *
FROM dbo.DateRange_sp4('2018-07-13', 20);
我的输出 returns 年、季度、月和星期几的结果相同。如何拆分不同列中的日期?或者还有其他方法吗?
每次迭代循环时,您都为 @StartDate 使用了相同的值。
假设您想要示例输出中每个日期的日期部分,在循环结束时您应该更新@StartDate 的值。
INSERT INTO @DateList
VALUES(@Counter + 1, DATEADD(day,@Counter, @StartDate), DATEPART(year, @StartDate), DATEPART(QUARTER, @StartDate),DATEPART(month, @StartDate), DatePart(WEEKDAY,@StartDate)) ;
SET @StartDate = DATEADD(day,@Counter + 1, @StartDate);
SET @Counter +=1;
使用计数table...它会快很多。检查 10K 天...和 运行 你的循环代码 10K 天。
declare @dateparameter date = '1900-04-12'
declare @numOfDays int = 10000
;WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select
datevalue = @dateparameter
,year = datepart(year,@dateparameter)
,quarter = datepart(quarter,@dateparameter)
,month = datepart(month,@dateparameter)
,dayofweek = datepart(weekday,@dateparameter)
union all
select
datevalue = dateadd(day,N,@dateparameter)
,year = datepart(year,dateadd(day,N,@dateparameter))
,quarter = datepart(quarter,dateadd(day,N,@dateparameter))
,month = datepart(month,dateadd(day,N,@dateparameter))
,dayofweek = datepart(weekday,dateadd(day,N,@dateparameter))
from cteTally
where N <= @numOfDays
但是,如果您要经常引用它,为什么不坚持 table? Aaron Bertran 对此有一篇很棒的文章: https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/