다음을 통해 공유


날짜 및 시간 데이터 사용

이 항목의 다음 섹션에서는 날짜/시간 데이터 형식 및 함수 사용에 대한 자세한 내용과 예를 제공합니다. 모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수(Transact-SQL)를 참조하십시오.

  • 날짜/시간 데이터 형식 연산자 사용

  • 날짜/시간 형식 사용

  • 문자열 리터럴 날짜/시간 형식

  • 구분되지 않은 문자열 형식

  • ISO 8601 형식

  • 알파벳 날짜 형식

  • 숫자 날짜 형식

  • 시간 형식

  • ODBC 날짜-시간 형식

  • date, time, datetime2 및 datetimeoffset 변환

  • 문자열 리터럴과 time(n), date, datetime2(n) 및 datetimeoffset(n) 간 변환

  • 날짜/시간 데이터 형식 간 변환

  • time, date, datetime2 및 datetimeoffset에 CAST 및 CONVERT 사용

  • CONVERT 함수의 스타일 인수

  • SQL Server 날짜/시간 제한 사항

  • 하위 클라이언트에 대한 이전 버전과의 호환성

날짜/시간 데이터 형식 연산자 사용

모든 날짜/시간 데이터 형식에 대해 관계형 연산자(<, <=, >, >=, <>), 비교 연산자(=, <, <=, >, >=, <>, !<, !>) 및 논리 연산자와 부울 조건자(IS NULL, IS NOT NULL, IN, BETWEEN, EXISTS, NOT EXISTS 및 LIKE)가 지원됩니다.

날짜/시간 산술 연산자

모든 날짜/시간 데이터 형식에 대해 더하기 및 빼기 연산을 수행하려면 DATEADDDATEDIFF를 사용합니다.

날짜/시간 형식 사용

문자열 리터럴 형식은 응용 프로그램에서 사용자에게 표시되는 데이터 표현에 영향을 주지만 SQL Server의 기본 정수 저장소 형식에는 영향을 주지 않습니다. 그러나 SQL Server는 저장소에 대해 응용 프로그램이나 사용자가 입력한 문자열 리터럴 형식의 날짜 값 또는 날짜 함수에 대한 날짜 값을 다른 날짜로 해석할 수 있습니다. 이러한 해석은 문자열 리터럴 형식, 데이터 형식 및 런타임 SET DATEFORMAT, SET LANGUAGE, default language 옵션 설정의 조합에 따라 달라집니다.

일부 문자열 리터럴 형식은 이러한 설정의 영향을 받지 않습니다. 설정이 형식에 대해 올바른지 알 수 없는 경우 이러한 설정의 영향을 받지 않는 형식을 사용하십시오. ISO 8601 형식은 이러한 설정의 영향을 받지 않는 국제 표준입니다. 문자열 리터럴 형식을 사용하는 Transact-SQL은 시스템 설정에 따라 달라지며 이식이 보다 어렵습니다.

하위 클라이언트에 대한 기본 문자열 리터럴 형식을 확인하려면 각 날짜/시간 데이터 형식에 대한 항목을 참조하십시오. 모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 데이터 형식 및 함수(Transact-SQL)를 참조하십시오.

ydm 날짜 형식은 date, datetime2 및 datetimeoffset 형식에 대해 지원되지 않습니다. 런타임 오류가 발생합니다.

문자열 리터럴 날짜/시간 형식

다음 표에서는 여러 가지 날짜/시간 문자열 형식을 나열합니다. DATEFORMAT에 종속되지 않는 다국어 날짜-시간 형식을 사용하는 것이 좋습니다. ISO 8601 형식인 '1998-02-23T14:23:05'와 '1998-02-23T14:23:05-08:00'은 유일한 국제 표준 형식입니다. 이러한 형식은 DATEFORMAT 또는 기본 로그인 언어에 종속되지 않으며 다국어입니다.

날짜-시간 부분

형식 유형

형식 예

다른 형식과의 결합 가능성

DATEFORMAT 종속 여부

다국어

날짜

구분되지 않음

ISO 8601

'19980223'

아니요

날짜

숫자

'02/23/1998'

아니요

(DATEFORMAT)

날짜

ISO 8601 숫자

'1998-02-23'

아니요

아니요

날짜

알파벳

'23 February 1998'

아니요

아니요

(월 또는 짧은 월)

날짜

ODBC 날짜

{d '1998-02-23'}

아니요

아니요

시간

ISO 8601 시간

'14:23:05'

'10:00:00.123456'

아니요

시간

ODBC 시간

{t '14:23:05'}

아니요

아니요

날짜-시간

ODBC 날짜-시간

{ts '1998-02-23 14:23:05'}

아니요

아니요

날짜-시간

ISO 8601

'1998-02-23T14:23:05'

'1998-02-23T14:23:05 -08:00'

아니요

아니요

예(date, datetime2, datetimeoffset)

날짜-시간

ANSI SQL 표준

'1998-02-23 14:23:05'

'1998-02-23 14:23:05 -08:00'

아니요

아니요(datetime2, datetimeoffset)

예(datetime)

예(date, datetime2, datetimeoffset)

날짜-시간

날짜/시간의 조합

'19980223 14:23:05'

'02/23/1998 2:23:05 PM'

'1998-02-23 10:00:00.123'

'23 Feb 1998 14:23:05'

아니요

(날짜 부분)

아니요

표준 시간대

표준 시간대 형식

'+12:00'

'01:00'

'-08:00'

'Z'

아니요

다음 문에서는 SET LANGUAGE 및 SET DATEFORMAT 설정의 효과를 보여 줍니다.

DECLARE @Today date = '12/1/2003';
DECLARE @MyTime time = '12:30:22';
DECLARE @MyDatetimeoffset datetimeoffset = '12/1/2003 12:30:22 -5:00';
SET LANGUAGE Italian
    -- Returns: Changed language setting to Italiano.
SELECT DATENAME(month, @Today) AS 'Month Name';
    -- Returns: dicembre
SELECT CONVERT(VARCHAR(30), @MyDatetimeoffset) AS 'DATETIMEOFFSET';
    -- Returns: dic  1 2003 12:30PM -05:00
SELECT DATENAME(hour, @MyTime) As 'Hour Name';
    -- Returns: 12

SET LANGUAGE us_english;
    -- Returns: Changed language setting to us_english.
SELECT DATENAME(month, @Today) AS 'Month Name';
    -- Returns: December
SELECT CONVERT(VARCHAR(30), @MyDatetimeoffset) AS 'DATETIMEOFFSET';
    -- Returns: Dec  1 2003 12:30PM -05:00
SELECT DATENAME(hour, @MyTime) As 'Hour Name';
    -- Returns: 12
GO
-- Set date format to month, day, year.
SET DATEFORMAT mdy;
GO
DECLARE @datevar date = '12/31/1998';
SELECT @datevar AS DateVar;
    -- Returns: 1998-12-31
GO
-- Set date format to year, day, month. 
SET DATEFORMAT ydm;
GO
DECLARE @datevar datetimeoffset = '1998/31/12 12:30:22 -05:00';
SELECT @datevar AS DateVar;
    -- Returns: Msg 241, Conversion failed when converting 
    -- date and/or time from character string.
GO
-- Set date format to year, month, day.
SET DATEFORMAT ymd;
GO
DECLARE @datevar date = '12/31/1998';
SELECT @datevar AS DateVar;
    -- Returns: 1998-12-31
GO

구분되지 않은 문자열 형식

날짜 데이터를 구분되지 않은 문자열로 지정할 수 있습니다. 날짜 데이터는 4자리, 6자리 또는 8자리 문자열이나 빈 문자열 또는 날짜 값이 없는 시간 값을 사용하여 지정할 수 있습니다.

SET DATEFORMAT 세션 설정은 구분 기호가 없는 숫자 항목과 같이 숫자로만 이루어진 날짜 항목에 적용되지 않습니다. 6자리 또는 8자리 문자열은 항상 ymd로 해석됩니다. 월과 일은 항상 두 자리여야 합니다.

[19]960415는 구분되지 않은 유효한 문자열 형식입니다. [19]960415

4자리로만 이루어진 문자열은 연도로 해석됩니다. 월과 일은 1월 1일로 설정됩니다. 4자리만 지정할 경우에는 세기를 포함해야 합니다.

ISO 8601 형식

시간 형식을 포함하는 ISO 8601 날짜는 다음과 같습니다.

  • YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]

  • YYYY-MM-DDThh:mm:ss[.nnnnnnn]Z[UTC(Coordinated Universal Time)]

T는 날짜-시간 값의 시간 시작 부분을 나타냅니다.

ISO 8601 형식을 사용하려면 각 요소를 이 형식으로 지정해야 합니다. 여기에는 T, 콜론(:), + 또는 -, 마침표(.)가 포함됩니다. 대괄호는 소수 자릿수 초 또는 표준 시간대 오프셋 구성 요소가 선택 사항임을 나타냅니다.

시간 구성 요소는 24시간 형식으로 지정됩니다.

ISO 8601 형식 사용의 이점은 이 형식이 국제 표준이라는 점입니다. 이 형식을 사용하여 지정된 날짜/시간 값은 명확합니다. 이 형식은 SET DATEFORMAT, SET LANGUAGE 또는 로그인 기본 언어 설정의 영향을 받지 않습니다.

다음은 ISO 8601 형식으로 지정된 두 가지 날짜-시간 값의 예입니다.

  • 2004-05-23T14:25:10

  • 2004-05-23T14:25:10.1234567+07:00

알파벳 날짜 형식

월을 이름으로 지정할 수 있습니다. 예를 들어 영어로 April 또는 약어 Apr로 지정할 수 있습니다. 이러한 이름은 세션의 LANGUAGE 설정에서 지정해야 합니다. 예를 들어 프랑스어로 avril 또는 avr로 지정합니다. 쉼표는 선택 사항이며 대문자는 무시됩니다.

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

  • 날짜/시간 데이터는 작은따옴표(')로 묶습니다.

  • 연도의 마지막 두 자리만 지정하는 경우 이 값이 two digit year cutoff 구성 옵션 값의 마지막 두 자리보다 작으면 구분 연도와 같은 세기로 간주됩니다. 이 옵션 값보다 크거나 같은 값은 구분 연도 전의 세기로 간주됩니다. 예를 들어 two digit year cutoff가 2050(기본값)이면 25는 2025로 해석되고 50은 1950으로 해석됩니다. 모호성을 피하려면 4자리 연도를 사용하십시오.

  • 일이 생략된 경우 해당 월의 첫째 날이 사용됩니다.

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

  • 다음 형식은 SQL Server 날짜 데이터에 대해 유효한 알파벳 형식입니다. 대괄호로 묶인 문자는 선택 사항입니다.

  • 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]

숫자 날짜 형식

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

numberseparatornumberseparatornumber [time] [time]

다음과 같은 숫자 형식을 사용할 수 있습니다.

  • [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)

세션의 기본 언어 DATEFORMAT은 기본 로그인 언어, SET LANGUAGE 문 또는 SET DATEFORMAT 문에 의해 설정됩니다. 언어가 기본 로그인 또는 SET LANGUAGE 문에 의해 us_english로 설정되어 있으면 날짜의 기본 순서는 mdy입니다.

SET DATEFORMAT 문을 사용하여 날짜 순서를 변경할 수 있습니다. SET DATEFORMAT 설정에 따라 날짜 값의 해석 방법이 결정됩니다. 순서가 설정과 다르면 값이 범위를 벗어나므로 날짜로 해석되지 않거나 잘못 해석됩니다. 예를 들어 12/10/08은 DATEFORMAT 설정에 따라 6가지 날짜 중 하나로 해석될 수 있습니다. 4자리 연도는 년으로 해석됩니다.

시간 형식

SQL Server는 다음과 같은 시간 데이터 형식을 인식합니다. 각 형식은 작은따옴표(')로 묶습니다.

  • 14:30

  • 14:30[:20:999]

  • 14:30[:20.9]

  • 4am

  • 4 PM

  • [0]4[:30:20:500]AM

다음 문에서는 CAST 함수에 대한 여러 가지 입력의 반환 값을 보여 줍니다.

SELECT CAST('01/01/2000 14:30' AS datetime2)
    --Returns: 2000-01-01 14:30:00.0000000
SELECT CAST('01/01/2000 14:30:20:999' AS datetime2)
    -- Returns: 2000-01-01 14:30:20.9990000
SELECT CAST('01/01/2000 14:30:20.9' AS datetime2)
    -- Returns: 2000-01-01 14:30:20.9000000
SELECT CAST('01/01/2000 4am' AS datetime2)
    -- Returns: 2000-01-01 04:00:00.0000000
SELECT CAST('01/01/2000 4 PM' AS datetime2)
    -- Returns: 2000-01-01 16:00:00.0000000
SELECT CAST('01/01/2000 04:30:20:500AM' AS datetime2)
    -- Returns: 2000-01-01 04:30:20.5000000
SELECT CAST('01/01/2000 04:30:20:500 AM' AS datetime2)
    -- Returns: 2000-01-01 04:30:20.5000000
GO

AM 또는 PM 접미사를 지정하여 시간 값이 정오 12시 이전인지 이후인지를 나타낼 수 있습니다. AM 또는 PM의 대/소문자는 무시됩니다.

시간은 12시간제 또는 24시간제를 사용하여 지정할 수 있습니다. 시간 값은 다음과 같이 해석됩니다.

  • 시간 값 00은 AM 지정 여부와 관계없이 자정 이후 시간(AM)을 나타냅니다. 시간이 00일 경우 PM을 지정할 수 없습니다.

  • 01부터 11까지의 시간 값은 AM 또는 PM을 지정하지 않는 경우 오전을 나타냅니다. 또한 이 시간은 AM을 지정하는 경우는 오전을 나타내고 PM을 지정하는 경우에는 오후를 나타냅니다.

  • 시간 값 12는 AM 또는 PM을 지정하지 않는 경우 정오 이후의 시간을 나타냅니다. 이 시간은 AM을 지정하는 경우 자정 이후의 시간을 나타내고 PM을 지정하는 경우에는 정오 이후의 시간을 나타냅니다. 예를 들어 12:01과 12:01 PM은 정오에서 1분 지난 시간이고 12:01 AM은 자정에서 1분 지난 시간입니다. 12:01 AM을 지정하는 것은 00:01 또는 00:01 AM을 지정하는 것과 같습니다.

  • 13부터 23까지의 시간 값은 AM 또는 PM을 지정하지 않는 경우 정오 이후의 시간을 나타냅니다. 또한 이 시간은 PM을 지정하는 경우 정오 이후의 시간을 나타냅니다. 13부터 23까지의 시간 값을 사용할 경우 AM을 지정할 수 없습니다.

  • 시간 값 24는 유효하지 않습니다. 대신 12:00 AM 또는 00:00을 사용하여 자정을 나타냅니다.

밀리초 앞에는 콜론(:) 또는 마침표(.)가 올 수 있습니다. 콜론이 오는 경우 숫자는 1/1000초를 의미합니다. 마침표가 오는 경우 1자리는 1/10초를 의미하고 2자리는 1/100초를 의미하며 3자리는 1/1000초를 의미합니다. 예를 들어 12:30:20:1은 12:30분에서 20과 1/1000초가 지난 시간을 의미하고 12:30:20.1은 12:30분에서 20과 1/10초가 지난 시간을 의미합니다.

ODBC 날짜-시간 형식

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

SQL Server는 ODBC 데이터를 항상 datetime 데이터 형식으로 처리합니다.

ODBC 타임스탬프 이스케이프 시퀀스의 형식은 다음과 같습니다.

{ literal_type 'constant_value' }

  • literal_type
    이스케이프 시퀀스의 유형을 지정합니다. literal_type에 대해 올바른 인수는 다음과 같습니다.

    d = 날짜만,

    t = 시간만,

    ts = 타임스탬프(시간+날짜)

  • 'constant_value'
    이스케이프 시퀀스의 값입니다. constant_value는 각 literal_type에 대해 이러한 형식을 사용해야 합니다.

    literal_type

    constant_value 형식

    d

    YYYY-MM-DD

    t

    hh:mm:ss[.fff]

    ts

    YYYY-MM-DDhh:mm:ss[.fff]

ODBC 시간 및 날짜 상수의 예는 다음과 같습니다.

  • { ts '1998-05-02 01:23:56.123' }

  • { d '1990-10-02' }

  • { t '13:33:41' }

ODBC 및 OLE DB timestamp 데이터 형식 이름과 Transact-SQLtimestamp 데이터 형식 이름을 혼동하지 마십시오. ODBC 및 OLE DB timestamp 데이터 형식은 날짜와 시간을 기록합니다. Transact-SQLtimestamp 데이터 형식은 시간에 관계없는 값을 가지는 binary 데이터 형식입니다.

date, time, datetime2 및 datetimeoffset 변환

서로 다른 날짜 형식 간에는 명시적 변환과 암시적 변환이라는 두 가지 변환이 있습니다. 암시적 변환은 CAST 또는 CONVERT 함수를 사용하지 않고 발생합니다. 명시적 변환은 CAST 또는 CONVERT 함수가 필요합니다.

문자열 리터럴과 time(n), date, datetime2(n) 및 datetimeoffset(n) 간 변환

문자열에 포함된 모든 부분의 형식이 올바른 경우 문자열 리터럴에서 날짜/시간 유형으로 변환할 수 있습니다. 그렇지 않으면 런타임 오류가 발생합니다.

날짜/시간 유형에서 문자열 리터럴로의 암시적 변환 또는 명시적 변환에 스타일을 지정하지 않은 경우 현재 세션의 기본 형식이 지정됩니다.

date, time, datetime2 및 datetimeoffset 데이터 형식에서 문자열로의 암시적 변환인 경우 SQL 표준 형식인 YYY-MM-DD hh:mi:ss.[nnnnnnn](CONVERT 스타일 121)이 적용됩니다. datetime 및 smalldatetime 데이터 형식에는 CONVERT 스타일 0 형식인 mon dd yyyy hh:miAM(또는 PM)이 적용됩니다.

다음 표에서는 date, time, datetime2 및 datetimeoffset 형식과 문자열 리터럴 간의 변환 규칙을 보여 줍니다.

입력 문자열 리터럴

date

time(n)

datetime2(n)

datetimeoffset(n)

ODBC DATE

참고 1을 참조하십시오.

참고 1을 참조하십시오.

참고 1을 참조하십시오.

참고 1을 참조하십시오.

ODBC TIME

참고 1을 참조하십시오.

참고 1을 참조하십시오.

참고 1을 참조하십시오.

참고 1을 참조하십시오.

ODBC DATETIME

참고 1을 참조하십시오.

참고 1을 참조하십시오.

참고 1을 참조하십시오.

참고 1을 참조하십시오.

DATE만

중요하지 않음

기본값이 제공됩니다.

TIME 부분의 기본값은 00:00:00입니다.

TIME 부분의 기본값은 00:00:00입니다. TIMEZONE의 기본값은 +00:00입니다.

TIME만

기본값이 제공됩니다.

중요하지 않음

DATE 부분의 기본값은 1900-1-1입니다.

DATE 부분의 기본값은 1900-1-1입니다. TIMEZONE의 기본값은 +00:00입니다.

TIMEZONE만

기본값이 제공됩니다.

기본값이 제공됩니다.

기본값이 제공됩니다.

기본값이 제공됩니다.

DATE+TIME

입력 문자열의 DATE 부분이 사용됩니다.

입력 문자열의 TIME 부분이 사용됩니다.

중요하지 않음

TIMEZONE의 기본값은 +00:00입니다.

DATE+TIMEZONE

허용 안 됨

허용 안 됨

허용 안 됨

허용 안 됨

TIME+TIMEZONE

기본값이 제공됩니다.

입력 문자열의 TIME 부분이 사용됩니다.

DATE 부분의 기본값은 1900-1-1입니다. TIMEZONE 입력은 무시됩니다.

DATE 부분의 기본값은 1900-1-1입니다.

DATE+TIME+TIMEZONE

로컬 DATETIME의 DATE 부분이 사용됩니다.

로컬 DATETIME의 TIME 부분이 사용됩니다.

로컬 DATETIME이 사용됩니다.

중요하지 않음

변환 참고

  1. ODBC 문자열 리터럴은 datetime 데이터 형식으로 매핑됩니다. ODBC DATETIME 리터럴에서 date, time, datetime2 또는 datetimeoffset 형식으로 할당하면 변환 규칙으로 정의된 대로 datetime과 이러한 형식 간에 암시적 변환이 발생합니다.

  2. datetime에 대한 소수 자릿수 초의 전체 자릿수는 1/300초까지 정확합니다(3.33밀리초 또는 0.00333초와 동일함). 값은 .000, .003 또는 .007초 단위로 반올림됩니다. '08/22/1995 10:15:19:999'에서 '.999'는 전체 자릿수를 초과하기 때문에 반올림됩니다.

  3. time(3), datetime2(3) 또는 datetimeoffset(3)의 경우 소수 자릿수 초의 전체 자릿수는 1밀리초까지 정확합니다. 따라서 '1995-8-22 10:15:19:999'는 반올림되지 않습니다.

  4. 입력 TIMEZONE 오프셋 부분은 hh와 mm 둘 다에 대해 항상 두 자리여야 합니다. + 또는 – 부호 중 하나는 필수입니다.

날짜/시간 데이터 형식 간 변환

이 섹션의 표에서는 다음의 각 날짜/시간 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하는 방법을 설명합니다.

  • date

  • time(n)

  • datetime

  • smalldatetime

  • datetimeoffset(n)

  • datetime2

date 데이터 형식

다음 표에서는 date 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하면 어떤 일이 발생하는지를 설명합니다.

변환할 데이터 형식

변환 정보

time(n)

변환이 실패하고 "피연산자 유형 충돌: date은(는) time과(와) 호환되지 않습니다"라는 오류 메시지 206이 발생합니다.

datetime

날짜가 복사됩니다. 다음 코드에서는 date 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @date date
DECLARE @datetime datetime
SELECT @date = '12-10-25'
SELECT @datetime = @date
SELECT @date AS '@date', @datetime AS '@datetime'
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

date 값이 smalldatetime의 범위 안에 있으면 날짜 구성 요소는 복사되고 시간 구성 요소는 00:00:00.000으로 설정됩니다. date 값이 smalldatetime 값의 범위 밖에 있으면 "date 데이터 형식을 smalldatetime 데이터 형식으로 변환하는 중 값 범위를 벗어났습니다"라는 오류 메시지 242가 발생하고 smalldatetime 값이 NULL로 설정됩니다.

다음 코드에서는 date 값을 smalldatetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @date date
DECLARE @smalldatetime smalldatetime
SELECT @date = '1912-10-25'
SELECT @smalldatetime = @date
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime'
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

날짜가 복사되고 시간은 00:00.0000000 +00:00으로 설정됩니다.

다음 코드에서는 date 값을 datetimeoffset(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @date date
DECLARE @datetimeoffset datetimeoffset(3)
SELECT @date = '1912-10-25'
SELECT @datetimeoffset = @date
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset'
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

날짜 구성 요소가 복사되고 시간 구성 요소는 00:00.0000000 +00:00으로 설정됩니다.

다음 코드에서는 date 값을 datetime2(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @date date
DECLARE @datetime2 datetime2(3)
SELECT @date = '1912-10-25'
SELECT @datetime2 = @date
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)'
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.000
--
--(1 row(s) affected)

time(n) 데이터 형식

다음 표에서는 time 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하면 어떤 일이 발생하는지를 설명합니다.

변환할 데이터 형식

변환 정보

time(n)

시, 분, 초가 복사됩니다. 대상 전체 자릿수가 원본 전체 자릿수보다 작으면 소수 자릿수 초가 대상 전체 자릿수에 맞게 잘립니다.

다음 예에서는 time(4) 값을 time(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @timeTo time(3)
DECLARE @timeFrom time(4)
SELECT @timeFrom = '12:34:54.1234'
SELECT @timeTo = @TimeFrom
SELECT @timeTo AS 'time(3)', @timeFrom AS 'time(4)'
--Results
--time(3)      time(4)
-------------- -------------
--12:34:54.123 12:34:54.1234
--
--(1 row(s) affected)

date

변환이 실패하고 "피연산자 유형 충돌: date은(는) time과(와) 호환되지 않습니다"라는 오류 메시지 206이 발생합니다.

datetime

시, 분, 초 값이 복사되고 날짜 구성 요소가 '1900-01-01'로 설정됩니다. time(n) 값에 대한 소수 자릿수 초의 전체 자릿수가 세 자리보다 크면 datetime 결과가 잘립니다.

다음 코드에서는 time(4) 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @time time(4)
DECLARE @datetime datetime
SELECT @time = '12:15:04.1234'
SELECT @datetime = @time
SELECT @time AS '@time', @datetime AS '@datetime'
--Result
--@time         @datetime
--------------- -----------------------
--12:15:04.1234 1900-01-01 12:15:04.123
--
--(1 row(s) affected)

smalldatetime

날짜가 '1900-01-01'로 설정되고 시 및 분 값이 복사됩니다. 초 및 소수 자릿수 초는 0으로 설정됩니다.

다음 코드에서는 time(4) 값을 smalldatetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @time time(4)
DECLARE @smalldatetime smalldatetime
SELECT @time = '12:15:04.1234'
SELECT @smalldatetime = @time
SELECT @time AS '@time', @smalldatetime AS '@smalldatetime'
--Result
--@time         @smalldatetime
--------------- -----------------------
--12:15:04.1234 1900-01-01 12:15:00
--
--(1 row(s) affected)

datetimeoffset(n)

날짜가 '1900-01-01'로 설정되고 시간이 복사됩니다. 표준 시간대 오프셋이 +00:00으로 설정됩니다. time(n) 값에 대한 소수 자릿수 초의 전체 자릿수가 datetimeoffset(n) 값의 전체 자릿수보다 크면 값이 이에 맞게 잘립니다.

다음 예에서는 time(4) 값을 datetimeoffset(3) 형식으로 변환한 결과를 보여 줍니다.

DECLARE @time time(4)
DECLARE @datetimeoffset datetimeoffset(3)
SELECT @time = '12:15:04.1234'
SELECT @datetimeoffset = @time
SELECT @time AS '@time', @datetimeoffset AS '@datetimeoffset'
--Result
--@time         @datetimeoffset
--------------- ------------------------------
--12:15:04.1234 1900-01-01 12:15:04.123 +00:00
--
--(1 row(s) affected)

datetime2(n)

날짜가 '1900-01-01'로 설정되고 시간 구성 요소가 복사되며 표준 시간대 오프셋이 00:00으로 설정됩니다. datetime2(n) 값에 대한 소수 자릿수 초의 전체 자릿수가 time(n) 값보다 크면 값이 이에 맞게 잘립니다.

다음 예에서는 time(4) 값을 datetime2(2) 값으로 변환한 결과를 보여 줍니다.

DECLARE @time time(4)
DECLARE @datetime2 datetime2(3)
SELECT @time = '12:15:04.1234'
SELECT @datetime2 = @time
SELECT @datetime2 AS '@datetime2', @time AS '@time'
--Result
--@datetime2              @time
------------------------- -------------
--1900-01-01 12:15:04.123 12:15:04.1234
--
--(1 row(s) affected)

datetime 데이터 형식

다음 표에서는 datetime 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하면 어떤 일이 발생하는지를 설명합니다.

변환할 데이터 형식

변환 정보

date

년, 월, 일이 복사됩니다. 시간 구성 요소는 00:00:00.000으로 설정됩니다.

다음 코드에서는 date 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @date date
DECLARE @datetime datetime
SELECT @date = '12-21-05'
SELECT @datetime = @date
SELECT @datetime AS '@datetime', @date AS '@date'
--Result
--@datetime               @date
------------------------- ----------
--2005-12-21 00:00:00.000 2005-12-21

time(n)

시간 구성 요소가 복사되고 날짜 구성 요소는 '1900-01-01'로 설정됩니다. time(n) 값의 소수 자릿수가 세 자리보다 크면 값이 이에 맞게 잘립니다.

다음 예에서는 time(4) 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @time time(4)
DECLARE @datetime datetime
SELECT @time = '12:10:05.1234'
SELECT @datetime = @time
SELECT @datetime AS '@datetime', @time AS '@time'
--Result
--@datetime               @time
------------------------- -------------
--1900-01-01 12:10:05.123 12:10:05.1234
--
--(1 row(s) affected)

smalldatetime

시, 분이 복사됩니다. 초 및 소수 자릿수 초는 0으로 설정됩니다.

다음 코드에서는 smalldatetime 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @smalldatetime smalldatetime
DECLARE @datetime datetime
SELECT @smalldatetime = '12-01-01 12:32'
SELECT @datetime = @smalldatetime
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime'
--Result
--@datetime               @smalldatetime
------------------------- -----------------------
--2001-12-01 12:32:00.000 2001-12-01 12:32:00
--
--(1 row(s) affected)

datetimeoffset(n)

날짜 및 시간 구성 요소가 복사됩니다. 표준 시간대는 잘립니다. datetimeoffset(n) 값의 소수 자릿수가 세 자리보다 크면 값이 잘립니다.

다음 예에서는 datetimeoffset(4) 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @datetime datetime
SELECT @datetimeoffset = '1968-10-23 12:45:37.1234 +10:0'
SELECT @datetime = @datetimeoffset
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset'
--Result
--@datetime               @datetimeoffset
------------------------- ------------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1234 +01:0
--
--(1 row(s) affected)

datetime2(n)

날짜 및 시간이 복사됩니다. datetime2(n) 값의 소수 자릿수가 세 자리보다 크면 값이 잘립니다.

다음 예에서는 datetime2(4) 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetime2 datetime2(4)
DECLARE @datetime datetime
SELECT @datetime2 = '1968-10-23 12:45:37.1237'
SELECT @datetime = @datetime2
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2'
--Result
--@datetime               @datetime2
------------------------- ------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
--
--(1 row(s) affected)

smalldatetime 데이터 형식

다음 표에서는 smalldatetime 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하면 어떤 일이 발생하는지를 설명합니다.

변환할 데이터 형식

변환 정보

date

년, 월, 일이 복사됩니다.

다음 코드에서는 smalldatetime 값을 date 값으로 변환한 결과를 보여 줍니다.

DECLARE @smalldatetime smalldatetime
DECLARE @date date
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @date = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @date AS 'date'
--Result
--@smalldatetime          date
------------------------- ----------
--1955-12-13 12:43:00     1955-12-13
--
--(1 row(s) affected)

time(n)

시, 분, 초가 복사됩니다. 소수 자릿수 초는 0으로 설정됩니다.

다음 코드에서는 smalldatetime 값을 time(4) 값으로 변환한 결과를 보여 줍니다.

DECLARE @smalldatetime smalldatetime
DECLARE @time time(4)
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @time = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @time AS 'time'
--Result
--@smalldatetime          time
------------------------- -------------
--1955-12-13 12:43:00     12:43:00.0000
--
--(1 row(s) affected)

datetime

smalldatetime 값이 datetime 값으로 복사됩니다. 소수 자릿수 초는 0으로 설정됩니다.

다음 코드에서는 smalldatetime 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @smalldatetime smalldatetime
DECLARE @datetime datetime
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @datetime = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @datetime AS 'datetime'
--Result
--@smalldatetime          datetime
------------------------- -----------------------
--1955-12-13 12:43:00     1955-12-13 12:43:00.000
--
--(1 row(s) affected)

datetimeoffset(n)

smalldatetime 값이 datetimeoffset(n) 값으로 복사됩니다. 소수 자릿수 초는 0으로 설정되고 표준 시간대 오프셋은 +00:0으로 설정됩니다.

다음 코드에서는 smalldatetime 값을 datetimeoffset(4) 값으로 변환한 결과를 보여 줍니다.

DECLARE @smalldatetime smalldatetime
DECLARE @datetimeoffset datetimeoffset(4)
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @datetimeoffset = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @datetimeoffset AS 'datetimeoffset(4)'
--Result
--@smalldatetime          datetimeoffset(4)
------------------------- ------------------------------
--1955-12-13 12:43:00     1955-12-13 12:43:00.0000 +00:0
--
--(1 row(s) affected)

datetime2(n)

smalldatetime 값이 datetime2(n) 값으로 복사됩니다. 소수 자릿수 초는 0으로 설정됩니다.

다음 코드에서는 smalldatetime 값을 datetime2(4) 값으로 변환한 결과를 보여 줍니다.

DECLARE @smalldatetime smalldatetime
DECLARE @datetime2 datetime2(4)
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @datetime2 = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @datetime2 AS ' datetime2(4)'
--Result
--@smalldatetime           datetime2(4)
------------------------- ------------------------
--1955-12-13 12:43:00     1955-12-13 12:43:00.0000
--
--(1 row(s) affected)

datetimeoffset(n) 데이터 형식

다음 표에서는 datetimeoffset(n) 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하면 어떤 일이 발생하는지를 설명합니다.

변환할 데이터 형식

변환 정보

date

년, 월, 일이 복사됩니다.

다음 코드에서는 datetimeoffset(4) 값을 date 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @date date
SELECT @datetimeoffset = '12-10-25 12:32:10 +01:0'
SELECT @date = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date'
--Result
--@datetimeoffset                date
-------------------------------- ----------
--2025-12-10 12:32:10.0000 +01:0 2025-12-10
--
--(1 row(s) affected)

time(n)

시, 분, 초 및 소수 자릿수 초가 복사됩니다. 표준 시간대 값은 잘립니다. datetimeoffset(n) 값의 전체 자릿수가 time(n) 값의 전체 자릿수보다 크면 값이 잘립니다.

다음 코드에서는 datetimeoffset(4) 값을 time(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @time time(3)
SELECT @datetimeoffset = '12-10-25 12:32:10.1234 +01:0'
SELECT @time = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time'
--Result
--@datetimeoffset                time
-------------------------------- ------------
--2025-12-10 12:32:10.1234 +01:0 12:32:10.123
--
--(1 row(s) affected)

datetime

날짜 및 시간 값이 복사되고 표준 시간대는 잘립니다. datetimeoffset(n) 값의 소수 자릿수가 세 자리보다 크면 값이 잘립니다.

다음 코드에서는 datetimeoffset(4) 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @datetime datetime
SELECT @datetimeoffset = '12-10-25 12:32:10.1234 +01:0'
SELECT @datetime = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime'
--Result
--@datetimeoffset                datetime
-------------------------------- -----------------------
--2025-12-10 12:32:10.1234 +01:0 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

날짜, 시, 분이 복사됩니다. 초는 0으로 설정됩니다.

다음 코드에서는 datetimeoffset(3) 값을 smalldatetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetimeoffset datetimeoffset(3)
DECLARE @smalldatetime smalldatetime
SELECT @datetimeoffset = '1912-10-25 12:24:32 +10:0'
SELECT @smalldatetime = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime'
--Result
--@datetimeoffset                @smalldatetime
-------------------------------- -----------------------
--1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
--
--(1 row(s) affected)

datetime2(n)

날짜 및 시간이 datetime2 값으로 복사되고 표준 시간대는 잘립니다. datetime2(n) 값의 전체 자릿수가 datetimeoffset(n) 값의 전체 자릿수보다 크면 소수 자릿수 초가 이에 맞게 잘립니다.

다음 코드에서는 datetimeoffset(4) 값을 datetime2(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @datetime2 datetime2(3)
SELECT @datetimeoffset = '1912-10-25 12:24:32.1234 +10:0'
SELECT @datetime2 = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2'
--Result
--@datetimeoffset                @datetime2
-------------------------------- -----------------------
--1912-10-25 12:24:32.1234 +10:0 1912-10-25 12:24:32.123
--
--(1 row(s) affected)

datetime2 데이터 형식

다음 표에서는 datetime2 데이터 형식을 다른 날짜/시간 데이터 형식으로 변환하면 어떤 일이 발생하는지를 설명합니다.

변환할 데이터 형식

변환 정보

date

년, 월, 일이 복사됩니다.

다음 코드에서는 datetime2(4) 값을 date 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetime2 datetime2(4)
DECLARE @date date
SELECT @datetime2 = '12-10-25 12:32:10.1234'
SELECT @date = @datetime2
SELECT @datetime2 AS '@datetime2', @date AS 'date'
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

시, 분, 초 및 소수 자릿수 초가 복사됩니다.

다음 코드에서는 datetime2(4) 값을 time(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetime2 datetime2(4)
DECLARE @time time(3)
SELECT @datetime2 = '12-10-25 12:32:10.1234'
SELECT @time = @datetime2
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)'
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.123
--
--(1 row(s) affected)

datetime

날짜 및 시간 값이 복사됩니다. datetimeoffset(n) 값의 소수 자릿수가 세 자리보다 크면 값이 잘립니다.

다음 코드에서는 datetime2 값을 datetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetime2 datetime2
DECLARE @datetime datetime
SELECT @datetime2 = '12-10-25 12:32:10.1234567'
SELECT @datetime = @datetime2
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime'
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
--2025-12-10 12:32:10.1234567 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

날짜, 시, 분이 복사됩니다. 초는 0으로 설정됩니다.

다음 코드에서는 datetime2 값을 smalldatetime 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetime2 datetime2
DECLARE @smalldatetime smalldatetime
SELECT @datetime2 = '12-10-25 12:32:10.1234567'
SELECT @smalldatetime = @datetime2
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime'
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
--2025-12-10 12:32:10.1234567 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

datetimeoffset(n)

datetime2(n) 값이 datetimeoffset(n) 값으로 복사됩니다. 표준 시간대 오프셋이 +00:0으로 설정됩니다. datetime2(n) 값의 전체 자릿수가 datetimeoffset(n) 값의 전체 자릿수보다 크면 값이 이에 맞게 잘립니다.

다음 코드에서는 datetime2(5) 값을 datetimeoffset(3) 값으로 변환한 결과를 보여 줍니다.

DECLARE @datetime2 datetime2(3)
DECLARE @datetimeoffset datetimeoffset(2)
SELECT @datetime2 = '12-10-25 12:32:10.1234567'
SELECT @datetimeoffset = @datetime2
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)'
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
--2025-12-10 12:32:10.123 2025-12-10 12:32:10.12 +00:00
--
--(1 row(s) affected)

time, date, datetime2 및 datetimeoffset에 CAST 및 CONVERT 사용

이 섹션에서는 날짜/시간 데이터 형식 간의 변환에 대한 정보를 제공합니다.

datetimeoffset으로 변환

  • 단순 할당 작업 등에서 표준 시간대가 있는 datetimeoffset 값을 표준 시간대가 없는 값으로부터 암시적으로 파생시킬 경우 표준 시간대가 없는 값은 로컬로 처리되며 이 값에서 현재 기본 표준 시간대 (00:00) 변위를 빼 UTC를 제공합니다.
  1. 다음 변환에서 표준 시간대 이외의 데이터 형식을 datetimeoffset으로 변환하는 경우 항상 UTC 표준 시간대 (00:00)이 추가됩니다.
  • datedate에서 datetimeoffset으로의 변환 datetimeoffset

  • timetime에서 datetimeoffset으로의 변환 datetimeoffset

  • datetime2datetime2에서 datetimeoffset으로의 변환 datetimeoffset

  • datetime 또는 smalldatetime에서 datetimeoffset으로의 변환

  • 표준 시간대 형식이 없는 유효한 date, time 또는 datetime의 문자열 리터럴에서 datetimeoffset으로의 변환

datetimeoffset에서 변환

datetimeoffset에서 다음과 같은 표준 시간대 이외의 유형으로 변환하는 경우 스타일 0(기본값)은 항상 반환 date, time, datetime2, datetime 또는 smalltime 값이 유지된 표준 시간대 오프셋의 로컬 형식임을 나타내며 스타일 1은 항상 UTC 형식을 나타냅니다.

표준 시간대가 없는 날짜 또는 시간 값을 다음 변환 중 하나에서 암시적으로 파생시킬 경우 datetimeoffset 값은 UTC로 처리됩니다. 유지된 표준 시간대 변위가 값에 더해져 현지 시간을 제공합니다. 표준 시간대 오프셋이 없는 경우 결과는 현지 시간입니다.

  • datetimeoffsetdatetimeoffset에서 date으로의 변환 date

  • datetimeoffsetdatetimeoffset에서 time으로의 변환 time

  • datetimeoffsetdatetimeoffset에서 datetime2으로의 변환 datetime2

  • datetimeoffset에서 datetime 또는 smalldatetime으로의 변환

  • 0 및 1 스타일은 datetimeoffset에서 문자열로의 변환에 사용할 수 없습니다. 대신 먼저 datetimeoffset에서 datetime2 또는 datetime으로 변환한 다음varchar 또는 char로 변환합니다.

기존 CONVERT 스타일에 시간 부분이 포함되고 datetimeoffset에서 문자열로 변환하는 경우 표준 시간대 오프셋(스타일 127 제외)이 포함됩니다. 표준 시간대 오프셋을 원하지 않는 경우 먼저 datetime2로 캐스팅한 다음 문자열로 캐스팅합니다.

모든 기존 날짜/시간 스타일은 모든 datetimeoffset에서 문자열로의 변환에 적용되고 표준 시간대 오프셋은 유지됩니다.

입력 문자열 표준 시간대 오프셋 부분은 hh와 mm 둘 다에 대해 항상 두 자리여야 하며 + 또는 – 부호 중 하나는 필수입니다.

변환에서 삭제된 정보

  • datetime2 또는 datetimeoffset에서 date로 변환하는 경우 반올림이 수행되지 않으며 날짜 부분은 명시적으로 추출됩니다. datetimeoffset의 경우 추출은 UTC 값이 아닌 로컬 날짜/시간에서 수행됩니다.

  • datetimeoffset에서 date, time, datetime2, datetime 또는 smalldatetime으로의 암시적 변환은 영구 표준 시간대 오프셋에 대한 로컬 날짜/시간 값을 기반으로 수행됩니다. 예를 들어 datetimeoffset(3) 값인 2006-10-21 12:20:20.999 -8:00이 time(3)으로 변환되면 결과는 20:20:20.999(UTC)가 아닌 12:20:20.999입니다.

변환에서의 잘림

  • 전체 자릿수가 많은 시간 값에서 전체 자릿수가 적은 값으로 변환할 수 있습니다. 전체 자릿수가 많은 값이 전체 자릿수가 적은 형식에 맞게 잘립니다.

소수 자릿수 초의 변환

스타일에 시간 형식 hh:mm:ss.mmm이 포함되는 경우 형식은 time(n), datetime2(n) 및 datetimeoffset(n)에 대해 hh:mm:ss.[nnnnnnn]이 됩니다. 자릿수는 유형 사양에 따라 달라집니다. 밀리초 전체 자릿수만 원하는 경우 먼저 datetime2(3)로 변환한 다음 문자열로 변환합니다.

스타일 9, 109, 13, 113, 21, 121, 130 및 131의 경우 문자열 변환 시 time, datetime2 및 datetimeoffset 형식에 대해서는 구분 기호 앞에 콜론(:) 소수 자릿수 초를 사용할 수 없습니다. 이러한 스타일의 출력 문자열 형식은 마침표(.)로 변환됩니다.

CONVERT 함수의 스타일 인수

다음 표에서는 CONVERT 함수의 스타일 인수에 사용할 수 있는 date, time, datetime2 및 datetimeoffset 값의 예를 나열합니다. 스타일에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)의 "인수" 섹션을 참조하십시오.

스타일

Associated standard

Input/Output (3)

format

date

time(n)

datetime2(n)

datetimeoffset(n)

0 또는 100(1,2)

기본값

mon dd yyyy hh:miAM(또는 PM)

Jan 1 2001

12:20PM

Jan 1 2001 12:20PM

Jan 1 2001 12:20PM -08:00

101

미국

mm/dd/yyyy

01/01/2001

-

01/01/2001

01/01/2001

102

ANSI

yy.mm.dd

2001.01.01

-

2001.01.01

2001.01.01

103

영국/프랑스

dd/mm/yy

01/01/2001

-

01/01/2001

01/01/2001

104

독일

dd.mm.yy

01.01.2001

-

01.01.2001

01.01.2001

105

이탈리아

dd-mm-yy

01-01-2001

-

01-01-2001

01-01-2001

106(1)

-

dd mon yy

01 Jan 2001

-

01 Jan 2001

01 Jan 2001

107(1)

-

Mon dd, yy

Jan 01, 2001

-

Jan 01, 2001

Jan 01, 2001

108

-

hh:mi:ss

-

12:20:20

12:20:20

12:20:20

9 또는 109(1,2)

기본값 + 밀리초

mon dd yyyy hh:mi:ss:mmmAM(또는 PM)

Jan 1 2001

12:20:20.1234567AM

Jan 1 2001 12:20:20.1234567PM

Jan 1 2001 12:20:20:1230000PM -08:00

110

미국

mm-dd-yy

01-01-2001

-

01-01-2001

01-01-2001

111

일본

yy/mm/dd

2001/01/01

-

2001/01/01

2001/01/01

112

ISO

yymmdd

20010101

-

20010101

20010101

13 또는 113(1,2)

유럽 기본값 + 밀리초

dd mon yyyy hh:mi:ss:mmm(24h)

01 Jan 2001

12:20:20.1234567

01 Jan 2001 12:20:20.1234567

01 Jan 2001 12:20:20:1230000 -08:00

114

-

hh:mi:ss:mmm(24h)

-

12:20:20.1234567

12:20:20.1234567

12:20:20:1230000 -08:00

20 또는 120(2)

ODBC 표준

yyyy-mm-dd hh:mi:ss(24h)

2001-01-01

12:20:20

2001-01-01 12:20:20

2001-01-01 12:20:20 -08:00

21 또는 121(2)

ODBC 표준(밀리초 포함)

yyyy-mm-dd hh:mi:ss.mmm(24h)

2001-01-01

12:20:20.1234567

2001-01-01 12:20:20.1234567

2001-01-01 12:20:20.1230000 -08:00

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm(공백 없이)

2001-01-01

12:20:20.1234567

2001-01-01T 12:20:20.1234567

2001-01-01T 12:20:20.1234567

127(6, 7)

ISO8601(Z 표준 시간대)

yyyy-mm-ddThh:mi:ss.mmmZ

(공백 없이)

2001-01-01

12:20:20.1234567Z

2001-01-01T 12:20:20.1234567Z

2001-01-01T20:20:20.1230000Z

130 (1,2)

회교식(5)

dd mon yyyy hh:mi:ss:mmmAM

01 Jan 2001

12:20:20.1230000PM

01 Jan 2001 12:20:20.1230000PM

1 Jan 2001 12:20:20:1230000PM -08:00

131 (2)

회교식(5)

dd/mm/yy hh:mi:ss:mmmAM

01/01/2001

12:20:20.1230000PM

01/01/2001 12:20:20.1230000PM

01/01/2001 12:20:20.1230000PM -08:00

1 이러한 스타일 값은 비결정적 결과를 반환합니다. 모든 (yy)(두 자리 연도) 스타일과 (yyyy)(네 자리 연도) 스타일의 하위 집합을 포함합니다.

2 기본값(style0 또는 100, 9 또는 109, 13 또는 113, 20 또는 120, 21 또는 121인 경우)은 항상 네 자리 연도(yyyy)를 반환합니다.

3datetime으로 변환할 때의 입력이며 문자 데이터로 변환할 때의 출력입니다.

4 XML용으로 고안되었습니다. datetime 또는 smalldatetime을 문자 데이터로 변환하는 경우 출력 형식은 앞의 표에서 설명한 것과 같습니다.

5 회교식 달력 시스템에는 여러 가지 형태가 있는데 SQL Server에서는 쿠웨이트 알고리즘을 사용합니다.

6 문자 데이터를 datetime 또는 smalldatetime으로 캐스팅하는 경우에만 지원됩니다. 날짜 또는 시간 구성 요소만 나타내는 문자 데이터를 datetime 또는 smalldatetime 데이터 형식으로 캐스팅하면 지정되지 않은 시간 구성 요소는 00:00:00.000으로 설정되고 지정되지 않은 날짜 구성 요소는 1900-01-01로 설정됩니다.

7 선택적 표준 시간대 표시 Z를 사용하면 표준 시간대 정보가 있는 XML datetime 값을 표준 시간대가 없는 SQL Serverdatetime 값에 쉽게 매핑할 수 있습니다. Z는 표준 시간대 UTC-0에 대한 표시입니다.

SQL Server 날짜/시간 제한 사항

다음 목록에서 날짜/시간은 날짜 또는 시간 부분을 포함하는 날짜-시간 데이터 형식을 가리킵니다.

  • datetimeoffset에 대해 서버측 DST(일광 절약 시간제)가 지원되지 않습니다.

  • 날짜에 대해 율리우스력이 지원되지 않습니다.

  • 자정에 대해 '24'시간제 표현의 시간 지원이 제공되지 않습니다.

  • '59'를 초과하는 '윤초' 지원의 시간 지원이 제공되지 않습니다.

  • 초 소수 부분 자릿수에 대해 '1나노초' 이상의 시간 지원이 제공되지 않습니다.

  • 시간에 대해 표준 시간대 지원이 제공되지 않습니다.

  • SQL 표준 INTERVAL 연산이 지원되지 않습니다.

하위 클라이언트에 대한 이전 버전과의 호환성

일부 하위 클라이언트는SQL Server 2008에 추가된 time, date, datetime2 및 datetimeoffset 데이터 형식을 지원하지 않습니다. 다음 표에서는 SQL Server 2008의 상위 수준 인스턴스와 하위 클라이언트 간의 유형 매핑을 보여 줍니다.

SQL Server 2008 데이터 형식

하위 클라이언트에 전달된 기본 문자열 리터럴 형식

하위 수준 ODBC

하위 수준 OLEDB

하위 수준 JDBC

하위 수준 SQLCLIENT

time

hh:mm:ss[.nnnnnnn]

SQL_WVARCHAR 또는 SQL_VARCHAR

DBTYPE_WSTR 또는 DBTYPE_STR

Java.sql.String

String 또는 SqString

date

YYYY-MM-DD

SQL_WVARCHAR 또는 SQL_VARCHAR

DBTYPE_WSTR 또는 DBTYPE_STR

Java.sql.String

String 또는 SqString

datetime2

YYYY-MM-DD hh:mm:ss[.nnnnnnn]

SQL_WVARCHAR 또는 SQL_VARCHAR

DBTYPE_WSTR 또는 DBTYPE_STR

Java.sql.String

String 또는 SqString

datetimeoffset

YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm

SQL_WVARCHAR 또는 SQL_VARCHAR

DBTYPE_WSTR 또는 DBTYPE_STR

Java.sql.String

String 또는 SqString

1. 날짜/시간 데이터 형식 비교

다음 예에서는 문자열 리터럴을 각 날짜/시간 데이터 형식으로 캐스팅한 결과를 비교합니다. smalldatetime 또는 datetime에 대해 허용된 자릿수를 초과하는 소수 자릿수 초의 전체 자릿수가 포함된 문자열 리터럴을 CAST하려고 하면 오류가 발생합니다.

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';

데이터 형식

출력

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(7)

2007-05-08 12:35:29.1234567

datetimeoffset(7)

2007-05-08 12:35:29.1234567 +12:15

2. 현재 시스템 날짜/시간 가져오기

다음 예에서는 현재 날짜/시간을 반환하는 SQL Server 시스템 함수를 사용하는 방법을 보여 줍니다.

SELECT SYSDATETIME() AS 'SYSDATETIME'

--Results
--SYSDATETIME
--2007-10-22 14:10:41.7984554
--(1 row(s) affected)

SELECT SYSDATETIMEOFFSET() AS 'SYSDATETIMEOFFSET'

--Results
--SYSDATETIMEOFFSET
--2007-10-22 14:11:34.2607172 -0
--(1 row(s) affected)

SELECT SYSUTCDATETIME() AS 'SYSUTCDATETIME'

--Results
--SYSUTCDATETIME
--2007-10-22 21:12:11.7069470
--(1 row(s) affected)

SELECT CURRENT_TIMESTAMP AS 'CURRENT_TIMESTAMP'

--Results
--CURRENT_TIMESTAMP
-------------------------
--2007-10-22 14:12:33.320
--(1 row(s) affected)

SELECT GETDATE() AS 'GETDATE'

--Results
--GETDATE
--2007-10-22 14:13:57.943
--(1 row(s) affected)

SELECT GETUTCDATE() AS 'GETUTCDATE'

--Results
--GETUTCDATE
--2007-10-22 21:14:35.657
--(1 row(s) affected)

3. 특정 일의 모든 datetime2 값 검색

  • 다음 예에서는 특정 일의 모든 날짜 및 시간 값을 검색하는 방법을 보여 줍니다.
-- Create a table that contains with the following dates:
--     The last date-time in 2005-04-06, '2005-04-06 23:59:59.9999999'
--     The first date-time in 2005-04-07, '2005-04-07 00:00:00.0000000'
--     The last date-time in 2005-04-07, '2005-04-07 23:59:59.9999999'
--     The first date-time in 2005-04-08, '2005-04-08 00:00:00.0000000'
CREATE TABLE #Search
    (
    MyDate datetime2
    );
INSERT INTO #Search(MyDate)VALUES('2005-04-06 23:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-07 00:00:00.0000000');
INSERT INTO #Search(MyDate)VALUES('2005-04-07 23:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-08 00:00:00.0000000');

-- The following four SELECT statements show different ways to find
-- only the two rows that contain 2005-04-07 dates.
--Use CONVERT.
SELECT MyDate 
FROM #Search 
WHERE CONVERT(date,MyDate) = '2005-04-07';

--Use >= and <=.
SELECT MyDate 
FROM #Search 
WHERE MyDate >= '2005-04-07 00:00:00.0000000' 
    AND MyDate <= '2005-04-07 23:59:59.9999999';

--Use > and <.
SELECT MyDate
FROM #Search
WHERE MyDate > '2005-04-06 23:59:59.9999999'
    AND MyDate < '2005-04-08 00:00:00.0000000';

--Use BETWEEN AND.
SELECT MyDate
FROM #Search
WHERE MyDate BETWEEN '2005-04-07 00:00:00.0000000'
    AND '2005-04-07 23:59:59.9999999';
DROP TABLE #Search
GO

4. 특정 일의 기간 검색

다음 예에서는 시간 범위를 찾기 위해 시간 값이 있는 날짜를 검색하는 방법을 보여 줍니다.

-- Create a table called Search and insert
-- five different time values for the same
-- date.

CREATE TABLE #Search
    (
    MyDate datetime2
    );

INSERT INTO #Search(MyDate)VALUES('2005-04-06 08:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 09:00:00.0000000');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 09:00:00.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 16:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 17:00:00.0000000');

-- The following SELECT statements show different ways
-- to search for dates that have time values to find a
-- time range.

--Using CONVERT with time (0) to ignore fractional seconds
SELECT MyDate 
FROM #Search 
WHERE CONVERT(time(0),MyDate) = '09:00:00';

--Returns two rows (ignores fractional seconds):
--2005-04-06 08:59:59.9999999
--2005-04-06 09:00:00.0000000

--Using CONVERT with time (7) to include fractional seconds
SELECT MyDate 
FROM #Search 
WHERE CONVERT(time(7),MyDate) = '09:00:00';

--Returns one row (matches fractional seconds):
--2005-04-06 09:00:00.0000000


--Each of the SELECT statements below use CONVERT
--to find all times in an eight-hour period.

--Use CONVERT with >= and <=.
SELECT MyDate 
FROM #Search 
WHERE CONVERT(time(7),MyDate) >=  '09:00:00.0000000'
    AND CONVERT(time(7),MyDate) <= '16:59:59.9999999'

--Use CONVERT with > and <.
SELECT MyDate
FROM #Search
WHERE CONVERT(time(7),MyDate) > '08:59:59.9999999'
    AND CONVERT(time(7),MyDate) < '17:00:00.0000000';

--Use CONVERT with BETWEEN AND
SELECT MyDate
FROM #Search
WHERE CONVERT(time(7),MyDate) BETWEEN '09:00:00.0000000'
    AND '16:59:59.9999999';
DROP TABLE #Search
GO

5. DATEPART 및 DATEADD를 사용하여 날짜 부분의 첫 번째 및 마지막 날 찾기

다음 예에서는 datepart의 첫 번째 또는 마지막 날을 반환하는 방법을 보여 줍니다.

-- When several months, quarters, or years are added to the base
-- year,1900-01-01, the returned day is the first day of a month.
-- To calculate the last day of the current month, you need to
--
-- 1. Find the difference in months between today and the base
--    year (0 ='1900-01-01'). This is accomplished by
--
-- DATEDIFF(month, 0, SYSDATETIME())
-- 2. Add that number of months plus 1 to the base year (0)
--    to obtain the first day of the next month.
--    DATEADD(month, DATEDIFF(month, 0, SYSDATETIME()) + 1, 0)
-- 3. Subtract 1 day.
--
--Find the first day of the current month.
SELECT DATEADD(month, DATEDIFF(month, 0, SYSDATETIME()), 0);

--Find the last day of the current month.
SELECT DATEADD(month, DATEDIFF(month, 0, SYSDATETIME()) + 1, 0) - 1;

-- Find the first day of the current quarter.
SELECT DATEADD(quarter, DATEDIFF(quarter, 0, SYSDATETIME()), 0);

-- Find the last day of the current quarter.
SELECT DATEADD(quarter, DATEDIFF(quarter, -1, SYSDATETIME()), -1);

-- Find the first day of the current year.
SELECT DATEADD(year, DATEDIFF(year, 0, SYSDATETIME()), 0);

-- Find the last day of the current year.
SELECT DATEADD(year, DATEDIFF(year, -1, SYSDATETIME()), -1);

6. DATEADD, DATEDIFF, DATENAME 및 DATEPART에 대해 사용자 정의 날짜 부분 인수 사용

다음 예에서는 datetime2 값의 일부에 상수를 추가하는 스칼라 사용자 정의 함수를 만듭니다.

USE tempdb
GO
CREATE FUNCTION UserDateadd
    (
    @datepart nvarchar(11)
    ,@number int 
    ,@date datetime2
    )
RETURNS datetime2
AS
BEGIN
    DECLARE @Return datetime2

    SELECT @Return = CASE @datepart
        WHEN 'year' THEN DATEADD(year,@number,@date) 
        WHEN 'yy' THEN DATEADD(year,@number,@date) 
        WHEN 'yyyy' THEN DATEADD(year,@number,@date) 
        WHEN 'quarter' THEN DATEADD(quarter,@number,@date) 
        WHEN 'qq' THEN DATEADD(quarter,@number,@date) 
        WHEN 'month' THEN DATEADD(month,@number,@date) 
        WHEN 'mm' THEN DATEADD(month,@number,@date) 
        WHEN 'm' THEN DATEADD(month,@number,@date) 
        WHEN 'dayofyear' THEN DATEADD(dayofyear,@number,@date) 
        WHEN 'dy' THEN DATEADD(dayofyear,@number,@date) 
        WHEN 'y' THEN DATEADD(dayofyear,@number,@date) 
        WHEN 'day' THEN DATEADD(day,@number,@date) 
        WHEN 'dd' THEN DATEADD(day,@number,@date) 
        WHEN 'd' THEN DATEADD(day,@number,@date) 
        WHEN 'week' THEN DATEADD(week,@number,@date) 
        WHEN 'wk' THEN DATEADD(week,@number,@date) 
        WHEN 'ww' THEN DATEADD(week,@number,@date) 
        WHEN 'weekday' THEN DATEADD(weekday,@number,@date) 
        WHEN 'wk' THEN DATEADD(weekday,@number,@date) 
        WHEN 'w' THEN DATEADD(weekday,@number,@date) 
        WHEN 'hour' THEN DATEADD(hour,@number,@date) 
        WHEN 'hh' THEN DATEADD(hour,@number,@date) 
        WHEN 'minute' THEN DATEADD(minute,@number,@date)
        WHEN 'mi' THEN DATEADD(minute,@number,@date) 
        WHEN 'n' THEN DATEADD(minute,@number,@date)  
        WHEN 'second' THEN DATEADD(second,@number,@date) 
        WHEN 'ss' THEN DATEADD(second,@number,@date)
        WHEN 's' THEN DATEADD(second,@number,@date)
        WHEN 'millisecond' THEN DATEADD(millisecond,@number,@date) 
        WHEN 'ms' THEN DATEADD(millisecond,@number,@date) 
        WHEN 'microsecond' THEN DATEADD(microsecond,@number,@date)
        WHEN 'mcs' THEN DATEADD(microsecond,@number,@date)
        WHEN 'nanosecond' THEN DATEADD(nanosecond,@number,@date)
        WHEN 'ns' THEN DATEADD(nanosecond,@number,@date)
    END
    return @Return
END
GO

SELECT GetDate()
SELECT dbo.UserDateadd('year', 1, GetDate())
GO

7. DATEPART를 사용하여 날짜 부분별로 그룹화

다음 예에서는 AdventureWorks 예제 데이터베이스를 사용합니다. 여기서는 DATEPART를 사용하여 평일별, 월별, 연도별 및 년/월/평일별로 총 판매액을 그룹화합니다.

USE AdventureWorks
GO
SELECT SUM(TotalDue) AS 'Total Sales'
    ,DATEPART(year,OrderDate)AS 'By Year'
    ,DATEPART(month,OrderDate) AS 'By Month'
    ,DATEPART(weekday,OrderDate) AS 'By Weekday'
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) IN('2003','2004')
GROUP BY GROUPING SETS 
    (
    (DATEPART(year,OrderDate))
    ,(DATEPART(month,OrderDate))
    ,(DATEPART(weekday,OrderDate))
    ,(
        DATEPART(year,OrderDate)
        ,DATEPART(month,OrderDate),
        DATEPART(weekday,OrderDate))
    )
ORDER BY DATEPART(year,OrderDate)
    ,DATEPART(month,OrderDate)
    ,DATEPART(weekday,OrderDate)