다음을 통해 공유


datetime(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

24시간 시계를 기반으로 하는 소수 자릿수 초와 하루 중 시간과 결합되는 날짜를 정의합니다.

새 작업에 날짜/시간을 사용하지 않습니다. 대신 시간, 날짜, datetime2datetimeoffset 데이터 형식을 사용합니다. 이러한 형식은 SQL Standard와 일치하며 이식성이 더 높습니다. time, datetime2datetimeoffset 은 더 많은 초 정밀도를 제공합니다. datetimeoffset 은 전역적으로 배포된 애플리케이션에 대한 표준 시간대 지원을 제공합니다.

설명

속성
Syntax DATETIME
사용법 DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
기본 문자열 리터럴 형식(하위 수준 클라이언트에 사용) 해당 없음
날짜 범위 1753-01-01(1753년 1월 1일)~9999-12-31(9999년 12월 31일)
시간 범위 00:00:00부터 23:59:59.997까지
표준 시간대 오프셋 범위 None
요소 범위 yyyy 는 연도를 나타내는 4자리 숫자입니다 1753 9999 .

MM 는 지정된 연도의 월을 나타내는 두 자리 숫자입니다 01 12.

dd 은 지정된 월의 요일을 나타내는 월에 따라 달라지는 01 31 두 자리 숫자입니다.

HH 는 시간을 나타내는 두 자리 숫자입니다 00 23.

mm 은 분을 나타내는 두 자리 숫자입니다 00 59.

ss 는 두 번째 숫자를 나타내는 두 자리 숫자입니다 00 59.

n*은 소수 자릿수 초를 나타내는 0~09993자리 숫자입니다.
문자 길이 최소 19자리부터 최대 23자리까지
스토리지 크기 8바이트
정확도(Accuracy) 증분 또는 .003.007 초 단위.000로 반올림됨
기본값 1900-01-01 00:00:00
캘린더 그레고리오리언(전체 연도 포함)
사용자 정의 소수 자릿수 초 정밀도 아니요
표준 시간대 오프셋 인식 및 보존 아니요
일광 절약 시간 인식 아니요

datetime에 대해 지원되는 문자열 리터럴 형식

다음 표에는 datetime에 대해 지원되는 문자열 리터럴 형식이 나와 있습니다. ODBC를 제외하고 datetime 문자열 리터럴은 작은따옴표('예: 'string_literaL' 환경이 아닌 us_english경우 문자열 리터럴은 유니코드 형식 N'string_literaL'이어야 합니다.

숫자 형식

숫자 월이 지정된 날짜 데이터를 지정할 수 있습니다. 예를 들어 5/20/97 1997년 5월 20일을 나타냅니다. 숫자 날짜 형식을 사용하는 경우 슬래시 기호(), 하이픈-() 또는 마침표.(/)를 구분 기호로 사용하는 문자열에서 월, 일 및 연도를 지정합니다. 이 문자열은 다음 형식으로 표시되어야 합니다.

<number separator number separator number [time] [time]>

언어가 설정된 us_english경우 날짜의 기본 순서는 (월, 일, 연도)입니다 mdy . SET DATEFORMAT 문을 사용하여 날짜 순서를 변경할 수 있습니다.

날짜 값이 해석되는 방법을 결정하는 설정 SET DATEFORMAT 입니다. 순서가 설정과 일치하지 않으면 값이 날짜로 해석되지 않습니다. 잘못된 날짜는 범위를 벗어나거나 잘못된 값으로 잘못 해석될 수 있습니다. 예를 들어 12/10/08 설정에 DATEFORMAT 따라 6개 날짜 중 하나로 해석할 수 있습니다. 4부로 구성된 연도는 연도로 해석됩니다.

날짜 형식 순서
[0]4/15/[19]96 mdy
[0]4-15-[19]96 mdy
[0]4.15.[19]96 mdy
[0]4/[19]96/15 myd
15/[0]4/[19]96 dmy
15/[19]96/[0]4 dym
[19]96/15/[0]4 ydm
[19]96/[0]4/15 ymd
시간 형식
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

사전순 형식

전체 월 이름으로 지정된 월을 사용하여 날짜 데이터를 지정할 수 있습니다. 예를 들어 April현재 언어로 지정된 월 약어 Apr입니다. 쉼표는 선택 사항이며 대문자는 무시됩니다.

다음은 알파벳 날짜 형식 사용에 대한 몇 가지 지침입니다.

  • 날짜 및 시간 데이터를 작은따옴표(')로 묶습니다. 영어 N''이외의 언어의 경우 .

  • 대괄호로 묶인 문자는 선택 사항입니다.

  • 연도의 마지막 두 자리만 지정하는 경우 두 자리 연도 구분 구성 옵션 값의 마지막 두 자리보다 작은 값은 구분 연도와 같은 세기에 있습니다. 이 옵션의 값보다 크거나 같은 값은 컷오프 연도 이전에 오는 세기에 있습니다. 예를 들어 두 자리 연도 구분선이 2050 (기본값) 25 인 경우 로 해석되고 2025 501950해석됩니다. 모호성을 피하려면 4자리 연도를 사용하세요.

  • 날짜가 누락된 경우 해당 월의 첫째 날이 제공됩니다.

  • 월을 SET DATEFORMAT 사전순 형식으로 지정하면 세션 설정이 적용되지 않습니다.

사전순
Apr[il] [15][,] 1996
Apr[il] 15[,] [19]96
Apr[il] 1996 [15]
[15] Apr[il][,] 1996
15 Apr[il][,][19]96
15 [19]96 apr[il]
[15] 1996 apr[il]
1996 APR[IL] [15]
1996 [15] APR[IL]

ISO 8601 형식

ISO 8601 형식을 사용하려면 형식, 콜론() 및 형식으로 표시된 마침표(:.)를 포함하여 T형식의 각 요소를 지정해야 합니다.

대괄호는 초의 소수 구성 요소가 선택 사항임을 나타냅니다. 시간 구성 요소는 24시간 형식으로 지정됩니다. 날짜T/시간 값의 시간 부분의 시작을 나타냅니다.

ISO 8601 형식을 사용할 때의 이점은 명확한 사양의 국제 표준이라는 점입니다. 또한 이 형식은 또는 SET LANGUAGE 설정의 SET DATEFORMAT 영향을 받지 않습니다.

예:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

비포장 형식

이 형식은 날짜 구분 기호가 없다는 점을 제외하고 ISO 8601 형식과 비슷합니다.

비포장
yyyyMMdd HH:mm:ss[.mmm]

ODBC 형식

ODBC API는 ODBC가 타임스탬프 데이터를 호출하는 날짜 및 시간 값을 나타내는 이스케이프 시퀀스를 정의합니다. 이 ODBC 타임스탬프 형식은 Microsoft OLE DB provider for SQL Server에서 지원하는 OLE DB 언어 정의(DBGUID-SQL)에서도 지원됩니다. ADO, OLE DB 및 ODBC 기반 API를 사용하는 애플리케이션은 이 ODBC 타임스탬프 형식을 사용하여 날짜와 시간을 나타낼 수 있습니다.

ODBC 타임스탬프 이스케이프 시퀀스는 다음과 같은 형식 { <literal_type> '<constant_value>' }입니다.

  • <literal_type> 는 이스케이프 시퀀스의 형식을 지정합니다. 타임스탬프에는 다음 세 <literal_type> 가지 지정자가 있습니다.

    • d = 날짜만
    • t = 시간 전용
    • ts = 타임스탬프(시간 + 날짜)
  • <constant_value> 는 이스케이프 시퀀스의 값입니다. <constant_value> 각각 <literal_type>에 대해 다음 형식을 따라야 합니다.

    • d: yyyy-MM-dd
    • t: hh:mm:ss[.fff]
    • ts: yyyy-MM-dd HH:mm:ss[.fff]
ODBC
{ ts '1998-05-02 01:23:56.123' }
{ d '1990-10-02' }
{ t '13:33:41' }

datetime 초 소수 부분 자릿수 반올림

datetime 값은 다음 예제와 .000같이 증분 또는 .003.007 초 단위로 반올림됩니다.

SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
    CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);

결과 집합은 다음과 같습니다.

사용자가 지정한 값 시스템 저장 값
01/01/2024 23:59:59.999 2024-01-02 00:00:00.000
01/01/2024 23:59:59.998
01/01/2024 23:59:59.997
01/01/2024 23:59:59.996
01/01/2024 23:59:59.995
2024-01-01 23:59:59.997
01/01/2024 23:59:59.994
01/01/2024 23:59:59.993
01/01/2024 23:59:59.992
2024-01-01 23:59:59.993
01/01/2024 23:59:59.991
01/01/2024 23:59:59.990
2024-01-01 23:59:59.990

ANSI 및 ISO 8601 규정 준수

datetime 은 ANSI 또는 ISO 8601을 준수하지 않습니다.

날짜 및 시간 데이터 변환

날짜 및 시간 데이터 형식으로 변환할 때 데이터베이스 엔진 날짜 또는 시간으로 인식할 수 없는 모든 값을 거부합니다. 날짜 및 시간 데이터와 함께 함수 및 CONVERT 함수를 사용하는 CAST 방법에 대한 자세한 내용은 CAST 및 CONVERT를 참조하세요.

다른 날짜 및 시간 형식을 날짜/시간 데이터 형식으로 변환

이 섹션에서는 다른 날짜 및 시간 데이터 형식을 datetime 데이터 형식으로 변환할 때 발생하는 상황에 대해 설명합니다.

변환이 날짜부터인 경우 연도, 월 및 날짜가 복사됩니다. 시간 구성 요소가 .로 00:00:00.000설정됩니다. 다음 코드는 값을 값 DATETIME 으로 변환한 DATE 결과를 보여줍니다.

DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;

SELECT @datetime AS '@datetime', @date AS '@date';

결과 집합은 다음과 같습니다.

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

이전 예제에서는 지역별 날짜 형식(MM-DD-YY)을 사용합니다.

DECLARE @date DATE = '12-21-16';

해당 지역의 형식과 일치하도록 예제를 업데이트해야 합니다.

ISO 8601 호환 날짜 형식(yyyy-MM-dd)으로 예제를 완료할 수도 있습니다. 예시:

DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;

SELECT @datetime AS '@datetime', @date AS '@date';

변환이 time(n)에서 이면 시간 구성 요소가 복사되고 날짜 구성 요소가 .로 1900-01-01설정됩니다. 시간(n) 값의 소수 자릿수가 3자리보다 크면 값이 잘립니다. 다음 예제에서는 값을 값 DATETIME 으로 변환한 TIME(4) 결과를 보여줍니다.

DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;

SELECT @datetime AS '@datetime', @time AS '@time';

결과 집합은 다음과 같습니다.

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.123  12:10:05.1237

smalldatetime에서 변환되면 시간 및 분이 복사됩니다. 초 및 소수 자릿수 초는 .로 0설정됩니다. 다음 코드는 값을 값 DATETIME 으로 변환한 SMALLDATETIME 결과를 보여줍니다.

DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime DATETIME = @smalldatetime;

SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';

결과 집합은 다음과 같습니다.

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

datetimeoffset(n)에서 변환되면 날짜 및 시간 구성 요소가 복사됩니다. 표준 시간대가 잘립니다. datetimeoffset(n) 값의 소수 자릿수가 3자리보다 크면 값이 잘립니다. 다음 예제에서는 값을 값 DATETIME 으로 변환한 DATETIMEOFFSET(4) 결과를 보여줍니다.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';

결과 집합은 다음과 같습니다.

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

datetime2(n)에서 변환되면 날짜와 시간이 복사됩니다. datetime2(n) 값의 소수 자릿수가 세 자리보다 크면 값이 잘립니다. 다음 예제에서는 값을 값 DATETIME 으로 변환한 DATETIME2(4) 결과를 보여줍니다.

DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;

SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';

결과 집합은 다음과 같습니다.

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

예제

다음 예제에서는 각 날짜시간 데이터 형식에 문자열을 캐스팅한 결과를 비교합니다.

SELECT CAST('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';

결과 집합은 다음과 같습니다.

데이터 형식 출력
time 12:35:29.1234567
date 2024-05-08
smalldatetime 2024-05-08 12:35:00
datetime 2024-05-08 12:35:29.123
datetime2 2024-05-08 12:35:29.1234567
datetimeoffset 2024-05-08 12:35:29.1234567 +12:15