ODBC 날짜 및 시간 기능 향상을 위한 데이터 형식 지원

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

이 항목에서는 SQL Server 날짜 및 시간 데이터 형식을 지원하는 ODBC 형식에 대한 정보를 제공합니다.

매개 변수 및 결과 집합의 데이터 형식 매핑

ODBC 데이터 형식(SQL_TYPE_TIMESTAMP 및 SQL_TIMESTAMP) 외에도 SQL Server Native Client ODBC에 두 개의 새 데이터 형식이 추가되어 새 서버 형식을 노출했습니다.

  • SQL_SS_TIME2

  • SQL_SS_TIMESTAMPOFFSET

다음 표에서는 전체 서버 유형 매핑을 보여줍니다. 표의 일부 셀에는 두 개의 항목이 포함되어 있습니다. 이 경우 첫 번째는 ODBC 3.0 값이고 두 번째는 ODBC 2.0 값입니다.

SQL Server 데이터 형식 SQL 데이터 형식
날짜/시간 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93(sql.h)

11(sqlext.h)
Smalldatetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93(sql.h)

11(sqlext.h)
날짜 SQL_TYPE_DATE

SQL_DATE
91(sql.h)

9(sqlext.h)
시간 SQL_SS_TIME2 -154(SQLNCLI.h)
Datetimeoffset SQL_SS_TIMESTAMPOFFSET -155(SQLNCLI.h)
Datetime2 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93(sql.h)

11(sqlext.h)

다음 표에서는 해당 구조체 및 ODBC C 형식을 나열합니다. ODBC는 드라이버 정의 C 형식을 허용하지 않으므로 시간 및 datetimeoffset에 SQL_C_BINARY 이진 구조로 사용됩니다.

SQL 데이터 형식 메모리 레이아웃 기본 C 데이터 형식 값(sqlext.h)
SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
SQL_TIMESTAMP_STRUCT

TIMESTAMP_STRUCT
SQL_C_TYPE_TIMESTAMP

SQL_C_TIMESTAMP
SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
SQL_TYPE_DATE

SQL_DATE
SQL_DATE_STRUCT

DATE_STRUCT
SQL_C_TYPE_DATE

SQL_C_DATE
SQL_TYPE_DATE

SQL_DATE
SQL_SS_TIME2 SQL_SS_TIME2_STRUCT SQL_C_SS_TIME2

SQL_C_BINARY(ODBC 3.5 이하)
0x4000(sqlncli.h)

SQL_BINARY(-2)
SQL_SS_TIMESTAMPOFFSET SQL_SS_TIMESTAMPOFFSET_STRUCT SQL_C_SS_TIMESTAMPOFFSET

SQL_C_BINARY(ODBC 3.5 이하)
0x4001(sqlncli.h)

SQL_BINARY(-2)

SQL_C_BINARY 바인딩을 지정하면 맞춤 검사가 수행되고 잘못된 맞춤에 대한 오류가 보고됩니다. 이 오류의 SQLSTATE는 IM016이며 "잘못된 구조 맞춤"이라는 메시지가 표시됩니다.

데이터 형식: 문자열 및 리터럴

다음 표에서는 SQL Server 데이터 형식, ODBC 데이터 형식 및 ODBC 문자열 리터럴 간의 매핑을 보여 줍니다.

SQL Server 데이터 형식 ODBC 데이터 형식 클라이언트 변환을 위한 문자열 형식
날짜/시간 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:mm:ss[.999]'

SQL Server는 Datetime에 대해 최대 3개의 소수 자릿수 초 자릿수를 지원합니다.
Smalldatetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:hh:ss'

이 데이터 형식의 정확도는 1분입니다. 초 구성 요소는 출력에서 0이 되고 입력할 때 서버에 의해 반올림됩니다.
날짜 SQL_TYPE_DATE

SQL_DATE
'yyyy-mm-dd'
시간 SQL_SS_TIME2 'hh:mm:ss[.9999999]'

소수 자릿수 초는 선택적으로 최대 7자리 숫자를 사용하여 지정할 수 있습니다.
Datetime2 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:mm:ss[.9999999]'

소수 자릿수 초는 선택적으로 최대 7자리 숫자를 사용하여 지정할 수 있습니다.
Datetimeoffset SQL_SS_TIMESTAMPOFFSET 'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm'

소수 자릿수 초는 선택적으로 최대 7자리 숫자를 사용하여 지정할 수 있습니다.

날짜/시간 리터럴에 대한 ODBC 이스케이프 시퀀스는 변경되지 않습니다.

결과의 소수 자릿수 초는 항상 콜론(:)이 아닌 점(.)을 사용합니다.

애플리케이션에 반환되는 문자열 값은 지정된 열에 대해 항상 동일한 길이입니다. 연도, 월, 일, 시, 분 및 초 구성 요소의 앞부분에는 최대 너비까지 0이 채워지며, datetime 값에서 날짜와 시간 사이에는 하나의 공백이 있습니다. datetimeoffset 값에는 시간 및 표준 시간대 오프셋 사이에 하나의 공백도 있습니다. 표준 시간대 오프셋은 항상 기호 앞에 옵니다. 오프셋이 0이면 이 기호는 더하기(+)입니다. 소수 자릿수 초는 필요한 경우 열에 대해 정의된 전체 자릿수까지 후행 0으로 채워집니다. datetime 열의 경우 세 개의 소수 자릿수 초 자릿수가 있습니다. smalldatetime 열의 경우 소수 자릿수 초의 자릿수가 정의되지 않으며 초는 항상 0이 됩니다.

빈 문자열은 유효한 날짜/시간 리터럴이 아니며 NULL 값을 나타내지 않습니다. 빈 문자열을 날짜/시간 값으로 변환하려고 하면 SQLState 22018 오류와 "캐스트 사양에 잘못된 문자 값"이라는 메시지가 표시됩니다.

문자열 매개 변수에서 변환하면 0시간 및 0분이 있는 표준 시간대의 기호가 더하기 또는 빼기일 수 있고 후행 0은 최대 9자리까지 소수 자릿수 초 동안 허용된다는 점을 제외하고 동일한 형식의 문자열이 필요합니다. 시간 구성 요소는 소수점 및 소수 자릿수 초 숫자로 종료할 수 있습니다.

현재 드라이버는 문장 부호 문자 주위에 추가 공백을 허용하며 시간 및 표준 시간대 오프셋 사이의 공간은 선택 사항입니다. 그러나 이 부분은 향후 릴리스에서 변경될 수 있으므로 현재 동작에 의존하도록 애플리케이션을 작성하면 안 됩니다.

데이터 형식: 데이터 구조

아래에 설명된 구조에서 ODBC는 양력에서 가져온 다음 제약 조건을 지정합니다.

  • 월 범위는 1에서 12까지입니다.

  • 일 필드의 범위는 1에서 해당 월의 일 수까지이며, 윤년을 고려하여 연도 및 월 필드와 일관성을 유지해야 합니다.

  • 시간 범위는 0에서 23까지입니다.

  • 분 범위는 0~59입니다.

  • 초 범위는 0에서 61.9(n)입니다. 이렇게 하면 최대 2초 동안 사이드리알 타임과의 동기화를 유지할 수 있습니다.

    SQL Server는 윤초를 허용하지 않으므로 59보다 큰 두 번째 값으로 인해 서버 오류가 발생합니다.

새 SQL Server 날짜 및 시간 데이터 형식을 지원하도록 다음과 같은 기존 ODBC 구조체에 대한 구현이 수정되었습니다. 그러나 정의는 변경되지 않았습니다.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

두 개의 새 구조체도 있습니다.

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

이 구조체는 32비트와 64비트 운영 체제 모두에서 12바이트까지 채워집니다.

typedef struct tagSS_TIME2_STRUCT {  
   SQLUSMALLINT hour;  
   SQLUSMALLINT minute;  
   SQLUSMALLINT second;  
   SQLUINTEGER fraction;  
} SQL_SS_TIME2_STRUCT;  

SQL_SS_TIMESTAMPOFFSET_STRUCT

typedef struct tagSS_TIMESTAMPOFFSET_STRUCT {  
   SQLSMALLINT year;  
   SQLUSMALLINT month;  
   SQLUSMALLINT day;  
   SQLUSMALLINT hour;  
   SQLUSMALLINT minute;  
   SQLUSMALLINT second;  
   SQLUINTEGER fraction;  
   SQLSMALLINT timezone_hour;  
   SQLSMALLINT timezone_minute;  
} SQL_SS_TIMESTAMPOFFSET_STRUCT;  

timezone_hour이면 timezone_minute 음수 또는 0이어야 합니다. timezone_hour 양수이면 timezone_minute 양수 또는 0이어야 합니다. timezone_hour 0이면 timezone_minute -59에서 +59까지의 값이 있을 수 있습니다.

참고 항목

날짜 및 시간 기능 향상(ODBC)