目标是从起始日期到结束日期获取指定范围内所有日期的完整列表。此信息将存储在游标中,以便后续处理。
为了完成此任务,实现了一个使用递归公用表表达式 (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中文网其他相关文章!