시스템 버전 임시 테이블의 데이터 쿼리Querying Data in a System-Versioned Temporal Table

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

temporal 테이블 데이터의 최신(실제) 상태를 가져오려면, 비temporal 테이블 쿼리와 완전히 동일한 방식으로 쿼리할 수 있습니다.When you want to get latest (actual) state of data in a temporal table, you can query completely the same way as you query non-temporal table. PERIOD 열이 숨겨져 있지 않은 경우, 해당 값은 SELECT * 쿼리에 나타납니다.If the PERIOD columns are not hidden, their values will appear in a SELECT * query. PERIOD 열을 숨김으로 지정하면 해당 값이 SELECT * 쿼리에 나타나지 않습니다.If you specified PERIOD columns as hidden, their values won’t appear in a SELECT * query. PERIOD 열이 숨겨진 경우 해당 열에 대한 값을 반환하기 위해 특히 SELECT 절의 PERIOD 열을 참조합니다.When the PERIOD columns are hidden, reference the PERIOD columns specifically in the SELECT clause to return the values for these columns.

모든 유형의 시간 기반 분석을 수행하려면, 4개의 임시 하위 절과 함께 새로운 FOR SYSTEM_TIME 절을 사용하여 현재 및 기록 테이블에서 데이터를 쿼리합니다.To perform any type of time-based analysis, use the new FOR SYSTEM_TIME clause with four temporal-specific sub-clauses to query data across the current and history tables. 이러한 절에 대한 자세한 내용은 임시 테이블FROM(Transact-SQL)을 참조하세요.For more information on these clauses, see Temporal Tables and FROM (Transact-SQL)

  • AS OF <날짜_시간>AS OF <date_time>

  • FROM <시작_날짜_시간> TO <종료_날짜_시간>FROM <start_date_time> TO <end_date_time>

  • BETWEEN <시작_날짜_시간> AND <종료_날짜_시간>BETWEEN <start_date_time> AND <end_date_time>

  • CONTAINED IN (<시작_날짜_시간> , <종료_날짜_시간>)CONTAINED IN (<start_date_time> , <end_date_time>)


    FOR SYSTEM_TIME 은 쿼리의 각 테이블에 독립적으로 지정될 수 있습니다.FOR SYSTEM_TIME can be specified independently for each table in a query. 공용 테이블 식, 테이블 반환 함수, 저장 프로시저 내에 사용될 수 있습니다.It can be used inside common table expressions, table-valued functions and stored procedures.

AS OF 하위 절을 사용한 특정 시간의 쿼리Query for a specific time using the AS OF sub-clause

과거의 특정 시간으로 데이터의 상태를 다시 구성해야 하는 경우AS OF 하위 절을 사용합니다.Use theAS OF sub-clause when you need to reconstruct state of data as it was at any specific time in the past. PERIOD 열 정의에 지정된 datetime2 형식의 자릿수로 데이터를 다시 구성할 수 있습니다.You can reconstruct the data with the precision of datetime2 type that was specified in PERIOD column definitions.
AS OF 하위 절은 상수 리터럴 또는 시간 조건을 동적으로 지정할 수 있는 변수와 사용될 수 있습니다.TheAS OF sub-clause clause can be used with constant literals or with variables, which allows you to dynamically specify time condition. 제공된 값은 UTC 시간으로 해석됩니다.The values provided values are interpreted as UTC time.

첫 번째 예는 dbo.Department 테이블의 상태를 과거의 특정 날짜로(AS OF) 반환합니다.This first example returns the state of the dbo.Department table AS OF a specific date in the past.

/*State of entire table AS OF specific date in the past*/   
SELECT [DeptID], [DeptName], [SysStartTime],[SysEndTime]   
FROM [dbo].[Department]   
FOR SYSTEM_TIME AS OF '2015-09-01 T10:00:00.7230011' ;  

두 번째 예는 행의 하위 집합에 시간의 두 지점 간의 값을 비교합니다.This second example compares the values between two points in time for a subset of rows.

DECLARE @ADayAgo datetime2   
SET @ADayAgo = DATEADD (day, -1, sysutcdatetime())   
/*Comparison between two points in time for subset of rows*/   
SELECT D_1_Ago.[DeptID], D.[DeptID],   
D_1_Ago.[DeptName], D.[DeptName],   
D_1_Ago.[SysStartTime], D.[SysStartTime],   
D_1_Ago.[SysEndTime], D.[SysEndTime]   
FROM [dbo].[Department] FOR SYSTEM_TIME AS OF @ADayAgo AS D_1_Ago   
JOIN [Department] AS D ON  D_1_Ago.[DeptID] = [D].[DeptID]    
AND D_1_Ago.[DeptID] BETWEEN 1 and 5 ;  

임시 쿼리의 AS-OF 하위 절에 뷰 사용Using views with AS-OF sub-clause in temporal queries

복잡한 지정 시간 분석이 필요한 경우 뷰를 사용하면 시나리오에 매우 유용합니다.Using views is very useful in scenarios when complex point-in time analysis is required.
일반적인 예로는 이전 달의 값으로 오늘 비즈니스 보고서를 생성하는 것을 들 수 있습니다.A common example is generating a business report today with the values for previous month.
일반적으로 고객은 외래 키 관계와 다수의 테이블을 포함하는 정규화된 데이터 모델을 갖습니다.Usually, customers have a normalized database model which involves many tables with foreign key relationships. 모든 테이블이 각각의 방식으로 독립적으로 변하기 때문에, 정규화된 모델의 데이터가 과거에 어떻게 보였는지에 대한 질문에 답변하는 것은 매우 어려울 수 있습니다.Answering the question how data from that normalized model looked like at a point in the past can very challenging, since all tables change independently, on their own cadence.
이런 경우, 가장 좋은 방법은 뷰를 만들고 전체 뷰에 AS OF 하위 절을 적용하는 것입니다.In this case, the best option is to create a view and apply the AS OF sub-clause to the entire view. 이러한 방식을 사용하면 SQL Server가 뷰 정의에 참여하는 모든 temporal 테이블에 AS OF 절을 투명하게 적용하기 때문에 데이터 액세스 계층의 모델링을 지정 시간 분석에서 분리할 수 있습니다.Using this approach allows you to decouple modeling of the data access layer from point-in time analysis as SQL Server will apply AS OF clause transparently to all temporal tables that participate in view definition. 또한, temporal 테이블을 비temporal 테이블과 동일한 뷰에서 결합할 수 있고, AS OF 가 temporal 테이블에만 적용됩니다.Furthermore, you can combine temporal with non-temporal tables in the same view and AS OF will be applied only to temporal ones. 뷰가 최소 하나의 temporal 테이블을 참조하지 않으면 임시 쿼리 절 적용에 오류가 발생하면서 실패합니다.If view does not reference at least one temporal table, applying temporal querying clauses to it will fail with an error.

/* Create view that joins three temporal tables: Department, CompanyLocation, LocationDepartments */   
CREATE VIEW [dbo].[vw_GetOrgChart]   
   , [CompanyLocation].LocName  
   , [CompanyLocation].City  
   , [Department].DeptID  
   , [Department].DeptName    
FROM [dbo].[CompanyLocation]   
LEFT JOIN [dbo].[LocationDepartments]    
   ON [CompanyLocation].LocID = LocationDepartments.LocID   
LEFT JOIN [dbo].[Department]    
   ON LocationDepartments.DeptID = [Department].DeptID ;  
/* Querying view AS OF */   
SELECT * FROM [vw_GetOrgChart]   
FOR SYSTEM_TIME AS OF '2015-09-01 T10:00:00.7230011' ;  

시간별 특정 행의 변화에 대한 쿼리Query for changes to specific rows over time

임시 하위 절 FROM...TO, BETWEEN...ANDCONTAINED IN 은 데이터 감사를 수행하려는 경우 즉, 현재 테이블의 특정 행에 대한 모든 변경 내용이 필요한 경우에 유용합니다.The temporal sub-clauses FROM...TO, BETWEEN...AND and CONTAINED IN are useful when you want to perform a data audit, i.e. when you need to get all historical changes for a specific row in the current table.
처음 두 개의 하위 절은 지정된 기간과 겹치는(즉, 지정된 기간 전에 시작되고 그 후에 종료되는) 행 버전을 반환하는 반면, CONTAINED IN은 지정된 기간 범위 내에 존재하는 것들만 반환합니다.The first two sub-clauses return row versions that overlap with a specified period (i.e. those that started before given period and ended after it), while CONTAINED IN returns only those that existed within specified period boundaries.


비현재 행 버전만을 검색하는 경우 CONTAINED IN 을 사용하는 것이 좋습니다. 이것은 기록 테이블에서만 작동하고 최고의 쿼리 성능을 냅니다.If you search for non-current row versions only, we recommend you to use CONTAINED IN as it works only with the history table and will yield the best query performance. 아무런 제한 없이 현재 데이터와 기록 데이터를 쿼리해야 하는 경우 ALL 을(를) 사용합니다.Use ALL when you need to query current and historical data without any restrictions.

/* Query using BETWEEN...AND sub-clause*/  
   , [DeptName]  
   , [SysStartTime]  
   , [SysEndTime]  
   , IIF (YEAR(SysEndTime) = 9999, 1, 0) AS IsActual   
FROM [dbo].[Department]   
FOR SYSTEM_TIME BETWEEN  '2015-01-01' AND '2015-12-31'   
WHERE DeptId = 1   
ORDER BY SysStartTime DESC;   

/*  Query using CONTAINED IN sub-clause */  
SELECT [DeptID], [DeptName], [SysStartTime],[SysEndTime]   
FROM [dbo].[Department]   
FOR SYSTEM_TIME CONTAINED IN ('2015-04-01', '2015-09-25')   
WHERE DeptId = 1   
ORDER BY SysStartTime DESC ;  

/*  Query using ALL sub-clause */   
   , [DeptName]   
   , [SysStartTime]   
   , [SysEndTime]   
   , IIF (YEAR(SysEndTime) = 9999, 1, 0) AS IsActual    
FROM [dbo].[Department] FOR SYSTEM_TIME ALL   
ORDER BY [DeptID], [SysStartTime] Desc  

이 문서가 도움이 되었나요?Did this Article Help You? 여러분의 의견을 환영합니다.We’re Listening

어떤 정보를 찾고 계세요? 정보를 찾으셨나요?What information are you looking for, and did you find it? 여러분의 의견은 문서의 내용을 개선하는 데 많은 도움이 됩니다.We’re listening to your feedback to improve the content. 의견이 있으면 sqlfeedback@microsoft.comPlease submit your comments to sqlfeedback@microsoft.com

참고 항목See Also

임시 테이블 Temporal Tables
FROM(Transact-SQL) FROM (Transact-SQL)
시스템 버전 임시 테이블 만들기 Creating a System-Versioned Temporal Table
시스템 버전 임시 테이블의 데이터 수정 Modifying Data in a System-Versioned Temporal Table
시스템 버전 임시 테이블의 스키마 변경 Changing the Schema of a System-Versioned Temporal Table
시스템 버전 임시 테이블에서 시스템 버전 관리 중지Stopping System-Versioning on a System-Versioned Temporal Table