다음을 통해 공유


간격 리터럴

ODBC를 사용하려면 모든 드라이버가 SQL_CHAR 또는 SQL_VARCHAR 데이터 형식을 모든 C 간격 데이터 형식으로 변환하도록 지원해야 합니다. 그러나 기본 데이터 원본이 간격 데이터 형식을 지원하지 않는 경우 드라이버는 이러한 변환을 지원하기 위해 SQL_CHAR 필드에 있는 값의 올바른 형식을 알고 있어야 합니다. 마찬가지로 ODBC에서는 모든 ODBC C 형식을 SQL_CHAR 또는 SQL_VARCHAR 변환할 수 있어야 하므로 드라이버는 문자 필드에 저장된 간격의 형식을 알아야 합니다. 이 섹션에서는 드라이버 작성기가 C 간격 데이터 형식으로 또는 C 간격 데이터 형식으로 변환하는 동안 SQL_CHAR 필드의 유효성을 검사하는 데 사용해야 하는 간격 리터럴의 구문을 설명합니다.

참고 항목

간격 리터럴에 대한 전체 BNF 구문은 부록 C: SQL 문법의 간격 리터럴 구문 섹션에 표시됩니다.

간격 리터럴을 SQL 문의 일부로 전달하기 위해 간격 리터럴에 대해 이스케이프 절 구문이 정의됩니다. 자세한 내용은 날짜, 시간 및 타임스탬프 리터럴을 참조 하세요.

간격 리터럴은 다음과 같은 형식입니다.

INTERVAL[<sign>] 'value' <interval qualifier>  

여기서 "INTERVAL"은 문자 리터럴이 간격임을 나타냅니다. 기호는 더하기 또는 빼기일 수 있습니다. 간격 문자열 외부에 있으며 선택 사항입니다.

간격 한정자는 단일 datetime 필드이거나 두 개의 날짜/시간 필드(선행 필드 TO <후행 필드>>)<로 구성될 수 있습니다.

  • 간격이 단일 필드로 구성된 경우 단일 필드는 괄호 안의 선택적 선행 전체 자릿수를 동반할 수 있는 초가 아닌 필드일 수 있습니다. 또한 단일 날짜/시간 필드는 선택적 선행 정밀도, 괄호 안의 선택적 소수 자릿수 초 정밀도 또는 둘 다를 함께 사용할 수 있는 두 번째 필드일 수도 있습니다. 초 필드에 선행 정밀도와 소수 자릿수 초 정밀도가 모두 있는 경우 쉼표로 구분됩니다. 초 필드에 소수 자릿수 초 정밀도가 있는 경우 선행 정밀도도 있어야 합니다.

  • 간격이 선행 및 후행 필드로 구성된 경우 선행 필드는 간격 선행 필드 전체 자릿수를 괄호로 나타낼 수 있는 초가 아닌 필드입니다. 후행 필드는 초가 아닌 필드이거나 괄호 안에 간격 소수-초 정밀도를 동반할 수 있는 두 번째 필드일 수 있습니다.

간격 문자열은 작은따옴표로 묶입니다. 1년 리터럴 또는 요일 리터럴일 수 있습니다. 값의 문자열 형식은 다음 규칙에 따라 결정됩니다.

  • 문자열에는 간격 한정>자가 암시하는 모든 필드에 대한 10진수 값이 <포함됩니다.

  • 간격 전체 자릿수에 YEAR 및 MONTH 필드가 포함된 경우 이러한 필드의 값은 빼기 기호로 구분됩니다.

  • 간격 전체 자릿수에 DAY 및 HOUR 필드가 포함된 경우 이러한 필드의 값은 공백으로 구분됩니다.

  • 간격 전체 자릿수에 HOUR 필드와 하위 순서 필드(MINUTE 및 SECOND)가 포함된 경우 이러한 필드의 값은 콜론으로 구분됩니다.

  • 간격 정밀도에 두 번째 필드가 포함되고 표현되거나 암시된 초 정밀도가 0이 아닌 경우 두 번째 소수 부분의 첫 번째 숫자 바로 앞에 있는 문자는 마침표입니다.

  • 다음을 제외하고 두 자리보다 긴 필드는 없습니다.

    • 선행 필드의 값은 표현되거나 암시적인 간격 선행 정밀도만큼 길 수 있습니다.

    • 두 번째 필드의 소수 부분은 표현되거나 암시된 초 정밀도만큼 길 수 있습니다.

    • 후행 필드는 그레고리오력의 일반적인 제약 조건을 따릅니다. (참조) 그레고리오력의 제약 조건입니다.)

다음 표에서는 간격에 대한 ODBC 이스케이프 절에 포함된 유효한 간격 리터럴의 예를 나열합니다. 이스케이프 절의 구문은 다음과 같습니다.

참고 항목

{INTERVAL sign interval-string interval-qualifier}

리터럴 이스케이프 절 지정된 간격
{INTERVAL '326' YEAR(4)} 326년의 간격을 지정합니다. 전체 자릿수를 선도하는 간격은 4입니다.
{INTERVAL '326' MONTH(3)} 326개월의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '3261' DAY(4)} 3261일의 간격을 지정합니다. 전체 자릿수를 선도하는 간격은 4입니다.
{INTERVAL '163' HOUR(3)} 163일의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '163' MINUTE(3)} 163분의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '223.16' SECOND(3,2)} 223.16초의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3이고 초 전체 자릿수는 2입니다.
{INTERVAL '163-11' YEAR(3) to MONTH} 163년 11개월의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '163 12' DAY(3) to Hour} 163일 및 12시간의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '163 12:39' DAY(3) to minute} 163일, 12시간, 39분의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '163 12:39:59.163' DAY(3) to SECOND(3)} 163일, 12시간, 39분, 59.163초의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3이고 초 전체 자릿수는 3입니다.
{INTERVAL '163:39' HOUR(3) to minute} 163시간 39분의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3입니다.
{INTERVAL '163:39:59.163' HOUR(3) to SECOND(4)} 163시간, 39분, 59.163초의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3이고 초 정밀도는 4입니다.
{INTERVAL '163:59.163' MINUTE(3) to second(5)} 163분 59.163초의 간격을 지정합니다. 앞에 오는 간격 정밀도는 3이고 초 전체 자릿수는 5입니다.
{INTERVAL -'16 23:39:56.23' DAY TO SECOND} 16일, 23시간, 39분, 56.23초의 간격을 지정합니다. 암시적 선행 정밀도는 2이고 암시적 초 정밀도는 6입니다.

다음 표에서는 잘못된 간격 리터럴의 예를 나열합니다.

리터럴 이스케이프 절 잘못된 이유
{INTERVAL '163' HOUR(2)} 선행 간격 전체 자릿수는 2이지만 선행 필드의 값은 163입니다.
{INTERVAL '223.16' SECOND(2,2)}

{INTERVAL '223.16' SECOND(3,1)}
첫 번째 예제에서는 선행 정밀도가 너무 작고 두 번째 예제에서는 초 정밀도가 너무 작습니다.
{INTERVAL '223.16' SECOND}

{INTERVAL '223' YEAR}
선행 정밀도는 지정되지 않으므로 기본값은 2로 설정되며, 이 값은 너무 작아서 지정된 리터럴을 보유할 수 없습니다.
{INTERVAL '22.1234567' SECOND} 초 정밀도는 지정되지 않으므로 기본값은 6입니다. 리터럴은 소수점 뒤의 7자리 숫자입니다.
{INTERVAL '163-13' YEAR(3) to MONTH}

{INTERVAL '163 65' DAY(3) to HOUR}

{INTERVAL '163 62:39' DAY(3) to minute}

{INTERVAL '163 12:125:59.163' DAY(3) to SECOND(3)}

{INTERVAL '163:144' HOUR(3) to minute}

{INTERVAL '163:567:234.163' HOUR(3) to SECOND(4)}

{INTERVAL '163:591.163' MINUTE(3) to second(5)}
후행 필드는 그레고리오력의 규칙을 따르지 않습니다.