[英]Creating a stored procedure in SQL Server 2014 that pulls between 2 dates
[英]Get all dates between 2 dates in SQL Server stored procedure
我正在使用SQL Server 2014,並且有一個表Attendance
。 該表有2列AttdDate
和Status
。 我想創建一個存儲過程,該存儲過程返回兩個日期之間的日期列表,即AttdDate
和status
。 如果AttdDate
在此列表(日期列表)中,則狀態應為true,否則狀態應為false。
有什么建議嗎? 謝謝
CREATE PROCEDURE sp_Attendance @Start DATETIME, @End DATETIME
AS
BEGIN
DECLARE @NumDays INT;
-- This will give you the number of days between your start date and end date.
SELECT @NumDays = DATEDIFF(DAY, @Start, @End) + 1;
WITH CTE AS (
SELECT TOP (@Numdays)
/*
ROW_NUMBER() OVER (ORDER BY a.object_id) will give you an integer from 1 to @NumDays becuase of TOP (@NumDays)
ROW_NUMBER() OVER (ORDER BY a.object_id) - 1 will give you an integer from 0 to @NumDays
DATEADD(DAY, ROW_NUMBER(), @Start) -- This will add the integer from the row number statement to your start date.
i.e.
@Start + 0
@Start + 1
@Start + 2
etc
etc
@Start + @NumDays
*/
DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY a.object_id) - 1, @Start) AS AttdDate
FROM
sys.all_columns a
CROSS JOIN
sys.all_columns b)
SELECT
c.AttdDate,
CASE WHEN a.AttdDate IS NOT NULL THEN 1 ELSE 0 END AS Status
FROM
CTE c
LEFT JOIN
Attendance a
ON c.AttdDate = a.AttdDate;
END;
您可以為此使用遞歸查詢:
WITH q(d) AS
(
SELECT @mindate
UNION ALL
SELECT DATEADD(day, 1 d)
FROM q
WHERE d < @maxdate
)
SELECT *
FROM q
OPTION (MAXRECURSION 0)
但是,對於更長的范圍,其性能將很差。
我通常只在SQL Server數據庫中創建一個表,其中包含所有可能直到2100年的日期:
SELECT *
FROM dates
WHERE d BETWEEN @mindate AND @maxdate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.