>데이터 베이스 >MySQL 튜토리얼 >SQL Server에서 날짜 범위를 효율적으로 검색하는 방법은 무엇입니까?

SQL Server에서 날짜 범위를 효율적으로 검색하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-12 10:43:44929검색

How to Efficiently Retrieve a Range of Dates 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
)</code>

그러나 이 CTE에서 커서를 직접 채우면 컴파일 오류가 발생하는 경우가 많습니다.

해결책:

접근법 1: 달력표 활용

캘린더 테이블을 미리 생성하면 고도로 최적화된 솔루션을 제공합니다. 이 테이블은 미리 정의된 날짜 범위를 저장하므로 쿼리 성능이 크게 향상됩니다.

<code class="language-sql">CREATE TABLE Calendar (
    Date DATE PRIMARY KEY
);

-- Insert dates into the Calendar table (example, adjust as needed)
INSERT INTO Calendar (Date)
SELECT DATEADD(DAY, n, '20000101')
FROM (SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 n FROM master..spt_values) AS Numbers;</code>

날짜 검색은 간단한 쿼리가 됩니다.

<code class="language-sql">SELECT Date
FROM Calendar
WHERE Date >= @MinDate
AND Date <= @MaxDate;</code>

접근법 2: 개선된 재귀 CTE

캘린더 테이블이 가능하지 않은 경우 세련된 재귀 CTE를 사용할 수 있습니다.

<code class="language-sql">DECLARE @MinDate DATE = '20140101';
DECLARE @MaxDate DATE = '20241231'; --Example, replace with your actual date

;WITH DateSeries AS (
    SELECT @MinDate AS Date
    UNION ALL
    SELECT DATEADD(day, 1, Date)
    FROM DateSeries
    WHERE Date < @MaxDate
)
SELECT Date
FROM DateSeries;</code>

커서 권장사항:

커서는 일반적으로 집합 기반 작업보다 효율성이 떨어진다는 점에 유의하는 것이 중요합니다. 최적의 성능을 위해서는 가능하면 커서를 사용하지 마십시오. 위의 CTE 접근 방식은 특히 달력 테이블을 사용하여 날짜 범위 검색에 훨씬 뛰어난 성능을 제공합니다. 필요한 경우 예측 가능한 결과를 얻으려면 CTE 내에서 ORDER BY을 사용하는 것이 좋습니다.

위 내용은 SQL Server에서 날짜 범위를 효율적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.