目標是從起始日期到結束日期取得指定範圍內所有日期的完整清單。此資訊將儲存在遊標中,以便後續處理。
為了完成此任務,實作了一個使用遞迴公用表表達式 (CTE) 的查詢:
<code class="language-sql">;with GetDates As ( select DATEADD(day,1,@maxDate) as TheDate UNION ALL select DATEADD(day,1, TheDate) from GetDates where TheDate < @minDate ) SELECT TheDate FROM GetDates</code>
但是,嘗試使用 CTE 結果填充遊標時發生錯誤:
<code class="language-sql">SET @DateCurSor = CURSOR FOR SELECT TheDate FROM GetDates</code>
錯誤訊息指出在關鍵字「SET」附近語法錯誤。
建議採用另一種方法,即使用日曆表。如果日曆表不存在,可以輕鬆建立。此表提供了日期的表格表示,大大簡化了檢索過程。
<code class="language-sql">DECLARE @MinDate DATE = '20140101', @MaxDate DATE = '20140106'; SELECT Date FROM dbo.Calendar WHERE Date >= @MinDate AND Date <= @MaxDate;</code>
如果沒有日曆表,則提供一個涉及系統表 sys.all_objects 的簡單流程:
<code class="language-sql">DECLARE @MinDate DATE = '20140101', @MaxDate DATE = '20140106'; SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) FROM sys.all_objects a CROSS JOIN sys.all_objects b;</code>
通常不建議在 SQL Server 中使用遊標。相反,基於集合的操作因其卓越的性能而更受歡迎。在所述場景中,確定特定日期特定項目的數量的任務無需使用遊標即可實現:
<code class="language-sql">SELECT TOP 1 date, it_cd, qty FROM T WHERE it_cd = 'i-1' AND Date BETWEEN @MinDate AND @MaxDate;</code>
以上是如何在 SQL Server 中高效率檢索日期範圍?的詳細內容。更多資訊請關注PHP中文網其他相關文章!