首頁 > 資料庫 > mysql教程 > 如何在 SQL Server 中高效率檢索日期範圍?

如何在 SQL Server 中高效率檢索日期範圍?

DDD
發布: 2025-01-12 11:22:42
原創
357 人瀏覽過

How to Efficiently Retrieve a Date Range in SQL Server?

在SQL Server中擷取兩個特定日期之間的所有日期

需求

目標是從起始日期到結束日期取得指定範圍內所有日期的完整清單。此資訊將儲存在遊標中,以便後續處理。

挑戰

為了完成此任務,實作了一個使用遞迴公用表表達式 (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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板