datetimeoffset(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 Microsoft Fabric Warehouse의 SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) SQL 분석 엔드포인트
datetime2와 같은 24시간 시계에 따라 하루의 시간과 결합되는 날짜를 정의하고 UTC(협정 세계시)를 기반으로 표준 시간대 인식을 추가합니다.
datetimeoffset 설명
속성 | 값 |
---|---|
Syntax | DATETIMEOFFSET [ ( fractional seconds precision ) ] |
사용법 | DECLARE @MyDatetimeoffset DATETIMEOFFSET(7); CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7)); |
기본 문자열 리터럴 형식(하위 수준 클라이언트에 사용) | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [{+|-}hh:mm] 자세한 내용은 다음 하위 수준 클라이언트 에 대한 이전 버전과의 호환성 섹션을 참조하세요. |
날짜 범위 | 0001-01-01 ~ 9999-12-31 CE 1년 1월 1일부터 CE 9999년 12월 31일까지 |
시간 범위 | 00:00:00 ~ 23:59:59.9999999 |
표준 시간대 오프셋 범위 | -14:00 ~ +14:00 |
요소 범위 | yyyy 는 연도 0001 9999 를 나타내는 4자리 숫자입니다.MM 는 지정된 연도의 월을 나타내는 두 자리 숫자입니다 01 12 .dd 은 지정된 월의 요일을 나타내는 월에 따라 달라 01 31 지는 두 자리 숫자입니다.HH 는 시간을 나타내는 두 자리 숫자입니다 00 23 .mm 은 분을 나타내는 두 자리 숫자입니다 00 59 .ss 는 두 번째 숫자를 나타내는 두 자리 숫자입니다 00 59 .n은 소수 자릿수 초를 나타내는 0~ 0 9999999 7자리 숫자입니다.hh 는 범위가 2자리인 -14 +14 숫자입니다.mm 는 범위가 2자리인 00 59 숫자입니다. |
문자 길이 | 최소 26개 위치(yyyy-MM-dd HH:mm:ss {+|-}hh:mm)에서 최대 34개(yyyy-MM-dd HH:mm:ss.nnnnnnn {+|-}hh:mm) |
정밀도, 소수 자릿수 | 다음 데이블을 참조하세요. |
스토리지 크기 | 10바이트 고정은 기본값인 100-ns 소수 자릿수 초 정밀도입니다. |
정확도(Accuracy) | 100나노초 |
기본값 | 1900-01-01 00:00:00 00:00 |
캘린더 | 양력 |
사용자 정의 소수 자릿수 초 정밀도 | 예 |
표준 시간대 오프셋 인식 및 보존 | 예 |
일광 절약 시간 인식 | 아니요 |
지정한 소수 자릿수 | 결과(전체 자릿수, 소수 자릿수) | 열 길이(바이트) | 소수 자릿수 초의 전체 자릿수 |
---|---|---|---|
datetimeoffset | (34, 7) | 10 | 7 |
datetimeoffset(0) | (26, 0) | 8 | 0~2 |
datetimeoffset(1) | (28, 1) | 8 | 0~2 |
datetimeoffset(2) | (29, 2) | 8 | 0~2 |
datetimeoffset(3) | (30, 3) | 9 | 3~4 |
datetimeoffset(4) | (31, 4) | 9 | 3~4 |
datetimeoffset(5) | (32, 5) | 10 | 5~7 |
datetimeoffset(6) | (33, 6) | 10 | 5~7 |
datetimeoffset(7) | (34, 7) | 10 | 5~7 |
datetimeoffset에 대해 지원되는 문자열 리터럴 형식
다음 표에서는 datetimeoffset에 대해 지원되는 ISO 8601 문자열 리터럴 형식을 나열합니다. datetimeoffset의 날짜 및 시간 부분에 대한 사전순, 숫자, 비포장 및 시간 형식에 대한 자세한 내용은 날짜(Transact-SQL) 및 시간(Transact-SQL)을 참조하세요.
ISO 8601 | 설명 |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] | 이러한 두 형식은 세션 SET DATEFORMAT 로캘 설정의 SET LANGUAGE 영향을 받지 않습니다. datetimeoffset과 datetime 부분 사이에는 공백이 허용되지 않습니다. |
yyyy-MM-ddTHH:mm:ss[.nnnnnnn]Z (UTC) | ISO 정의에 따른 이 형식은 datetime 부분이 UTC(Coordinated Universal Time)로 표현되어야 함을 나타냅니다. 예를 들어 . 1999-12-12 12:30:30.12345 -07:00 1999-12-12 19:30:30.12345Z |
다음 예제에서는 각 날짜 및 시간 데이터 형식에 문자열을 캐스팅한 결과를 비교합니다.
SELECT CAST('2007-05-08 12:35:29. 1234567 +12:15' AS TIME(7)) AS 'time',
CAST('2007-05-08 12:35:29. 1234567 +12:15' AS DATE) AS 'date',
CAST('2007-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST('2007-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIME2(7)) AS 'datetime2',
CAST('2007-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset',
CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset IS08601';
결과 집합은 다음과 같습니다.
데이터 형식 | 출력 |
---|---|
time |
12:35:29.1234567 |
date |
2007-05-08 |
smalldatetime |
2007-05-08 12:35:00 |
datetime |
2007-05-08 12:35:29.123 |
datetime2 |
2007-05-08 12:35:29.1234567 |
datetimeoffset |
2007-05-08 12:35:29.1234567 +12:15 |
datetimeoffset IS08601 |
2007-05-08 12:35:29.1234567 +12:15 |
표준 시간대 오프셋
표준 시간대 오프셋은 시간 또는 날짜/시간 값에 대한 UTC의 영역 오프셋을 지정합니다. 표준 시간대 오프셋은 [+|-] hh:mm:으로 나타낼 수 있습니다.
hh
은 표준 시간대 오프셋의 시간 수를 나타내는 두 자리00
14
숫자입니다.mm
는 표준 시간대 오프셋의 추가 시간(분)을 나타내는 두 자리 숫자입니다00
59
.+
(더하기) 또는-
(빼기)는 표준 시간대 오프셋에 대한 필수 기호입니다. 이 기호는 표준 시간대 오프셋이 현지 시간을 얻기 위해 UTC 시간에서 추가되거나 뺄지 여부를 나타냅니다. 표준 시간대 오프셋의 유효한 범위는 다음에서-14:00
입니다+14:00
.
표준 시간대 오프셋 범위는 XSD 스키마 정의에 대한 W3C XML 표준을 따르며 SQL 2003 표준 정의 12:59
+14:00
와 약간 다릅니다.
선택적 유형 매개 변수인 초 소수 부분 자릿수는 초의 소수 부분의 자릿수를 지정합니다. 이 값은 0~7(100나노초)의 정수일 수 있습니다. 기본 소수 자릿수 초 정밀도 는 100 ns(초의 소수 부분에 대한 7자리 숫자)입니다.
데이터는 데이터베이스에 저장되고 UTC와 같이 서버에서 처리, 비교, 정렬 및 인덱싱됩니다. 표준 시간대 오프셋은 검색을 위해 데이터베이스에 유지됩니다.
지정된 표준 시간대 오프셋은 DST(일광 절약 시간) 인식 및 DST 기간의 지정된 날짜/시간에 맞게 조정된 것으로 간주됩니다.
datetimeoffset 형식의 경우 UTC 및 로컬(영구 또는 변환된 표준 시간대 오프셋에 대한) 날짜/시간 값은 삽입, 업데이트, 산술, 변환 또는 할당 작업 중에 유효성이 검사됩니다. 잘못된 UTC 또는 로컬(영구 또는 변환된 표준 시간대 오프셋에 대한) 날짜/시간 값이 검색되면 잘못된 값 오류가 발생합니다. 예를 들어 9999-12-31 10:10:00
UTC에서는 유효하지만 현지 시간에 표준 시간대 오프셋 +13:50
으로 오버플로됩니다.
표준 시간대 변환 구문
SQL Server 2016(13.x)은 AT TIME ZONE
일광 절약 시간을 인식하고 범용 표준 시간대 변환을 용이하게 하는 구문을 도입했습니다. 이 구문은 표준 시간대 오프셋이 없는 데이터를 표준 시간대 오프셋이 있는 데이터로 변환할 때 특히 유용합니다. 대상 표준 시간대에서 해당 datetimeoffset 값으로 변환하려면 AT TIME ZONE을 참조하세요.
ANSI 및 ISO 8601 규정 준수
날짜 및 시간 문서의 ANSI 및 ISO 8601 규정 준수 섹션이 datetimeoffset에 적용됩니다.
하위 수준 클라이언트에 대한 이전 버전과의 호환성
일부 하위 수준 클라이언트는 시간, 날짜, datetime2 및 datetimeoffset 데이터 형식을 지원하지 않습니다. 다음 표에서는 SQL Server의 상위 수준 인스턴스와 하위 수준 클라이언트 간의 형식 매핑을 보여 줍니다.
SQL Server 데이터 형식 | 하위 수준 클라이언트에 전달되는 기본 문자열 리터럴 형식 | 하위 수준 ODBC | 하위 수준 OLEDB | 하위 수준 JDBC | 하위 수준 SQLCLIENT |
---|---|---|---|---|---|
time | HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR 또는 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 또는 SqString |
date | yyyy-MM-dd | SQL_WVARCHAR 또는 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 또는 SqString |
datetime2 | yyyy-MM-dd HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR 또는 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 또는 SqString |
datetimeoffset | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR 또는 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 또는 SqString |
Microsoft Fabric 지원
Microsoft Fabric에서는 현재 datetimeoffset 데이터 형식의 열을 만들 수 없지만, AT TIME ZONE(Transact-SQL) 함수를 사용하여 데이터를 변환하는 데 datetimeoffset을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
SELECT
CAST(CAST('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS datetime2) AS PST
Microsoft Fabric SQL 데이터베이스에서 7자리 자릿수의 정밀도를 사용할 수 있지만 Fabric OneLake에 미러된 데이터에는 표준 시간대와 7번째 시간 소수점이 잘립니다. 이 열 형식은 Fabric SQL 데이터베이스의 테이블에서 기본 키로 사용할 수 없습니다.
날짜 및 시간 데이터 변환
날짜 및 시간 데이터 형식으로 변환하는 경우 SQL Server는 날짜 또는 시간으로 인식할 수 없는 모든 값을 거부합니다. 날짜 및 시간 데이터와 함께 함수 및 CONVERT
함수를 사용하는 CAST
방법에 대한 자세한 내용은 CAST 및 CONVERT를 참조하세요.
datetimeoffset 데이터 형식으로 변환
이 섹션에서는 오프셋 없이 데이터 형식에서 새 datetimeoffset 데이터 형식 열로 데이터를 업데이트하는 예제를 제공합니다.
먼저 sys.time_zone_info 시스템 카탈로그 뷰에서 표준 시간대 이름을 확인합니다.
SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';
다음 예제에서는 AT TIME ZONE 구문을 두 번 사용합니다. 샘플 코드는 테이블을 dbo.Audit
만들고, 여러 일광 절약 시간 변경에 걸쳐 있는 데이터를 추가하고, 새 datetimeoffset 열을 추가합니다. 열이 AuditCreated
오프셋이 없는 *datetime2 데이터 형식이며 UTC 표준 시간대를 사용하여 작성되었다고 가정합니다.
UPDATE
문 AT TIME ZONE
에서 구문은 먼저 기존 열 데이터에 UTC 표준 시간대 오프셋을 AuditCreated
추가한 다음, 데이터를 UTC에서 UTC로 Pacific Standard Time
변환하여 미국 과거 일광 절약 시간 범위의 기록 데이터를 올바르게 조정합니다.
CREATE TABLE dbo.Audit (AuditCreated DATETIME2(0) NOT NULL);
GO
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('1/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('5/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('12/1/2024 12:00:00');
GO
ALTER TABLE dbo.Audit
ADD AuditCreatedOffset DATETIMEOFFSET(0) NULL;
GO
DECLARE @TimeZone VARCHAR(50);
SELECT @TimeZone = [name]
FROM sys.time_zone_info
WHERE [name] = 'Pacific Standard Time';
UPDATE dbo.Audit
SET AuditCreatedOffset = AuditCreated
AT TIME ZONE 'UTC' AT TIME ZONE @TimeZone
WHERE AuditCreatedOffset IS NULL;
GO
SELECT *
FROM dbo.Audit;
결과 집합은 다음과 같습니다.
AuditCreated AuditCreatedOffset
------------------- --------------------------
2024-01-01 12:00:00 2024-01-01 04:00:00 -08:00
2024-05-01 12:00:00 2024-05-01 05:00:00 -07:00
2024-12-01 12:00:00 2024-12-01 04:00:00 -08:00
datetimeoffset 데이터 형식을 다른 날짜 및 시간 형식으로 변환
이 섹션에서는 datetimeoffset 데이터 형식을 다른 날짜 및 시간 데이터 형식으로 변환할 때 발생하는 상황에 대해 설명합니다.
날짜로 변환하면 연도, 월 및 날짜가 복사됩니다. 다음 코드에서는 datetimeoffset(4) 값을 날짜 값으로 변환한 결과를 보여 줍니다.
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';
결과 집합은 다음과 같습니다.
@datetimeoffset date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10
변환이 time(n)이면 시간, 분, 초 및 소수 자릿수 초가 복사됩니다. 표준 시간대 값은 잘립니다. datetimeoffset(n) 값의 전체 자릿수가 time(n) 값의 전체 자릿수보다 크면 값이 반올림됩니다. 다음 코드에서는 datetimeoffset(4) 값을 time(3) 값으로 변환한 결과를 보여 줍니다.
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time TIME(3) = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';
결과 집합은 다음과 같습니다.
@datetimeoffset time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124
datetime으로 변환하면 날짜 및 시간 값이 복사되고 표준 시간대가 잘립니다. datetimeoffset(n) 값의 소수 자릿수가 3자리보다 크면 값이 잘립니다. 다음 코드에서는 datetimeoffset(4) 값을 datetime 값으로 변환한 결과를 보여 줍니다.
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime DATETIME = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';
결과 집합은 다음과 같습니다.
@datetimeoffset datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
smalldatetime으로 변환하는 경우 날짜와 시간이 복사됩니다. 초 값에 따라 분이 반올림되고 초가 0으로 설정됩니다. 다음 코드에서는 datetimeoffset(3) 값을 smalldatetime 값으로 변환한 결과를 보여 줍니다.
DECLARE @datetimeoffset DATETIMEOFFSET(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime SMALLDATETIME = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';
결과 집합은 다음과 같습니다.
@datetimeoffset @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
datetime2(n)로 변환하면 날짜와 시간이 datetime2 값으로 복사되고 표준 시간대가 잘립니다. datetime2(n) 값의 전체 자릿수가 datetimeoffset(n) 값의 전체 자릿수보다 크면 소수 자릿수 초가 잘립니다. 다음 코드에서는 datetimeoffset(4) 값을 datetime2(3) 값으로 변환한 결과를 보여 줍니다.
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 DATETIME2(3) = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';
결과 집합은 다음과 같습니다.
@datetimeoffset @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00 1912-10-25 12:24:32.12
문자열 리터럴을 datetimeoffset으로 변환
문자열의 모든 부분이 유효한 형식인 경우 문자열 리터럴에서 날짜 및 시간 형식으로 변환할 수 있습니다. 그렇지 않으면 런타임 오류가 발생합니다. 날짜 및 시간 형식에서 문자열 리터럴로 스타일을 지정하지 않는 암시적 변환 또는 명시적 변환은 현재 세션의 기본 형식입니다. 다음 표에서는 문자열 리터럴을 datetimeoffset 데이터 형식으로 변환하는 규칙을 보여 줍니다.
입력 문자열 리터럴 | datetimeoffset(n) |
---|---|
ODBC DATE |
ODBC 문자열 리터럴은 datetime 데이터 형식에 매핑됩니다. 리터럴에서 ODBC DATETIME datetimeoffset 형식으로 할당 작업을 수행하면 변환 규칙에 정의된 대로 datetime과 이 형식 간에 암시적 변환이 발생합니다. |
ODBC TIME |
이전 ODBC DATE 규칙 참조 |
ODBC DATETIME |
이전 ODBC DATE 규칙 참조 |
DATE 에만 해당 |
파트의 기본값은 TIME .입니다 00:00:00 . 기본값:TIMEZONE +00:00 |
TIME 에만 해당 |
파트의 기본값은 DATE .입니다 1900-1-1 . 기본값:TIMEZONE +00:00 |
TIMEZONE 에만 해당 |
기본값이 제공됩니다. |
DATE + TIME |
기본값:TIMEZONE +00:00 |
DATE + TIMEZONE |
허용되지않음 |
TIME + TIMEZONE |
DATE 파트의 기본값은 입니다. 1900-1-1 |
DATE + TIME + TIMEZONE |
중요하지 않음 |