首页 >数据库 >mysql教程 >如何在 SQL Server 中高效检索日期范围?

如何在 SQL Server 中高效检索日期范围?

DDD
DDD原创
2025-01-12 11:22:42362浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn