집 >데이터 베이스 >MySQL 튜토리얼 >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 중국어 웹사이트의 기타 관련 기사를 참조하세요!