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까지의 값이 있을 수 있습니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기