sql-server - 接受开始日期和从开始日期开始的连续日期数的存储过程

标签 sql-server adventureworks

该参数应考虑开始日期以及从开始日期开始的连续日期的数量。

然后,存储过程应根据提供的两个参数填充 DateRange 表的所有列。

我创建了一个表:

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);

我的输出对于年、季度、月和周返回相同的结果。如何将日期拆分到不同的列中?或者还有其他办法吗?

Screenshot of my output

最佳答案

使用计数表...会快很多。检查 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

但是,如果您要经常引用它,为什么不制作一个持久表呢? Aaron Bertran 有一篇关于此的很棒的文章: https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

关于sql-server - 接受开始日期和从开始日期开始的连续日期数的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51331953/

相关文章:

C# 使用 OLEDB 连接调用存储过程不起作用

sql - 条形码的数据类型是什么?

sql-server - 审计触发器中的当前事务 ID

sql-server - Windows Azure VM 之间的数据库镜像

使用 IF 进行 SQL 字符串比较

sql-server - SQL Server 2008 的示例数据库

SQL 最小值()、最大值()

mysql - SQL Server - (AdventureWorks) 列出没有产品的供应商