다음을 통해 공유


datetime 데이터 형식을 C에서 SQL로 변환

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

이 항목에서는 C 형식에서 SQL Server 날짜/시간 형식으로 변환할 때 고려해야 할 문제를 나열합니다.

다음 표에서 설명하는 변환은 클라이언트에서 수행되는 변환에 해당합니다. 클라이언트가 서버에 정의된 매개 변수와 다른 매개 변수에 대해 소수 자릿수 초 정밀도를 지정하는 경우 클라이언트 변환은 성공할 수 있지만 SQLExecute 또는 SQLExecuteDirect가 호출될 때 서버는 오류를 반환합니다. 특히 ODBC는 소수 자릿수 초의 잘림을 오류로 처리하지만 SQL Server 동작은 반올림하는 것입니다. 예를 들어 datetime2(6)에서 datetime2(2)이동하면 반올림이 발생합니다. Datetime 열 값은 1/300초로 반올림되고 smalldatetime 열은 서버에서 초를 0으로 설정합니다.

SQL_TYPE_DATE SQL_TYPE_TIME SQL_SS_TIME2 SQL_TYPE_TIMESTAMP SQL_SS_TIMSTAMPOFFSET SQL_CHAR SQL_WCHAR
SQL_C_DATE 1 - - 1,6 1,5,6 1,13 1,13
SQL_C_TIME - 1 1 1,7 1,5,7 1,13 1,13
SQL_C_SS_TIME2 - 1,3 1,10 1,7 1,5,7 1,13 1,13
SQL_C_BINARY(SQL_SS_TIME2_STRUCT) 해당 없음 해당 없음 1,10,11 해당 없음 해당 없음 해당 없음 해당 없음
SQL_C_TYPE_TIMESTAMP 1,2 1,3,4 1,4,10 1,10 1,5,10 1,13 1,13
SQL_C_SS_TIMESTAMPOFFSET 1,2,8 1,3,4,8 1,4,8,10 1,8,10 1,10 1,13 1,13
SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT) 해당 없음 해당 없음 해당 없음 해당 없음 1,10,11 해당 없음 해당 없음
SQL_C_CHAR/SQL_WCHAR(날짜) 9 9 9 9,6 9,5,6 해당 없음 해당 없음
SQL_C_CHAR/SQL_WCHAR(time2) 9 9,3 9,10 9,7,10 9,5,7,10 해당 없음 해당 없음
SQL_C_CHAR/SQL_WCHAR(datetime) 9,2 9,3,4 9,4,10 9,10 9,5,10 해당 없음 해당 없음
SQL_C_CHAR/SQL_WCHAR(datetimeoffset) 9,2,8 9,3,4,8 9,4,8,10 9,8,10 9,10 해당 없음 해당 없음
SQL_C_BINARY(SQL_DATE_STRUCT) 1,11 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
SQL_C_BINARY(SQL_TIME_STRUCT) 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음
SQL_C_BINARY(SQL_TIMESTAMP_STRUCT) 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음 해당 없음

기호 설명

  • -: 변환이 지원되지 않습니다. SQLSTATE 07006 및 "제한된 데이터 형식 특성 위반" 메시지와 함께 진단 레코드가 생성됩니다.

  • 1: 제공된 데이터가 유효하지 않으면 SQLSTATE 22007 및 "잘못된 날짜/시간 형식"이라는 메시지와 함께 진단 레코드가 생성됩니다.

  • 2: 시간 필드는 0이어야 합니다. 또는 SQLSTATE 22008 및 메시지 "소수 잘림"을 사용하여 진단 레코드가 생성됩니다.

  • 3: 소수 자릿수 초는 0이어야 합니다. 또는 SQLSTATE 22008 및 메시지 "Fractional 잘림"을 사용하여 진단 레코드가 생성됩니다.

  • 4: 날짜 구성 요소가 무시됩니다.

  • 5: 표준 시간대가 클라이언트의 표준 시간대 설정으로 설정됩니다.

  • 6: 시간이 0으로 설정됩니다.

  • 7: 날짜가 현재 날짜로 설정됩니다.

  • 8: 시간이 클라이언트의 표준 시간대에서 UTC로 변환됩니다. 이 변환 중에 오류가 발생하면 SQLSTATE 22008 및 "Datetime 필드 오버플로" 메시지와 함께 진단 레코드가 생성됩니다.

  • 9: 문자열이 구문 분석되어 발생한 첫 번째 문장 부호 문자와 나머지 구성 요소의 존재 여부에 따라 날짜, datetime, datetimeoffset 또는 시간 값으로 변환됩니다. 그런 다음 위 표에서 이 프로세스에 의해 발견된 원본 형식에 대한 규칙에 따라 문자열이 대상 형식으로 변환됩니다. 데이터를 구문 분석하는 동안 오류가 감지되면 SQLSTATE 22018 및 "캐스트 사양에 잘못된 문자 값"이라는 메시지와 함께 진단 레코드가 생성됩니다. datetime 및 smalldatetime 매개 변수의 경우 연도가 이러한 형식에서 지원하는 범위를 벗어나면 SQLSTATE 22007 및 "잘못된 날짜/시간 형식"이라는 메시지와 함께 진단 레코드가 생성됩니다.

    datetimeoffset의 경우 UTC로의 변환이 요청되지 않더라도 값은 UTC로 변환한 후 범위 내에 있어야 합니다. 이는 TDS와 서버가 항상 UTC에 대한 datetimeoffset 값의 시간을 정규화하므로 클라이언트는 시간 구성 요소가 UTC로 변환한 후 지원되는 범위 내에 있는지 확인해야 하기 때문입니다. 값이 지원되는 UTC 범위 내에 있지 않으면 SQLSTATE 22007 및 "잘못된 날짜/시간 형식"을 사용하여 진단 레코드가 생성됩니다.

  • 10: 데이터 손실이 발생하는 경우 SQLSTATE 22008 및 "잘못된 시간 형식"이라는 메시지로 진단 레코드가 생성됩니다. 이 오류는 값이 서버에서 사용하는 UTC 범위로 나타낼 수 있는 범위를 벗어나는 경우에도 발생합니다.

  • 11: 데이터의 바이트 길이가 SQL 형식에 필요한 구조체의 크기와 같지 않으면 SQLSTATE 22003 및 "숫자 값이 범위를 벗어났습니다"라는 메시지와 함께 진단 레코드가 생성됩니다.

  • 12: 데이터의 바이트 길이가 4 또는 8이면 데이터는 원시 TDS smalldatetime 또는 datetime 형식으로 서버로 전송됩니다. 데이터의 바이트 길이가 SQL_TIMESTAMP_STRUCT 크기와 정확히 일치하는 경우 데이터는 datetime2의 TDS 형식으로 변환됩니다.

  • 13: 데이터 손실이 있는 잘림이 발생하면 SQLSTATE 22001과 "문자열 데이터, 오른쪽 잘린" 메시지로 진단 레코드가 생성됩니다.

    소수 자릿수(소수 자릿수)의 수는 다음 표에 따라 대상 열의 크기에서 결정됩니다.

    암시된 소수 자릿수 암시된 소수 자릿수
    Type 0 1..9
    SQL_C_TYPE_TIMESTAMP 19 21..29

    그러나 SQL_C_TYPE_TIMESTAMP 경우 데이터 손실 없이 소수 자릿수 초를 세 자리 숫자로 나타낼 수 있고 열 크기가 23 이상인 경우 정확히 3초의 소수 자릿수 자릿수가 생성됩니다. 이 동작은 이전 ODBC 드라이버를 사용하여 개발된 애플리케이션에 대한 이전 버전과의 호환성을 보장합니다.

    테이블의 범위보다 열 크기가 큰 경우 소수 자릿수가 9인 것으로 간주됩니다. 이 변환은 최대 9개의 소수 자릿수(ODBC에서 허용하는 최대값)를 허용해야 합니다.

    크기가 0인 열은 ODBC에서 변수 길이 문자 형식의 크기에 제한이 없음을 의미합니다(SQL_C_TYPE_TIMESTAMP의 3자리 규칙이 적용되지 않는 경우 9자리). 고정 길이 문자 형식으로 열 크기를 0으로 지정하는 것은 오류입니다.

  • 해당 없음: 기존 SQL Server 2005(9.x) 및 이전 동작이 유지됩니다.

참고 항목

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