Поделиться через


Литералы интервала

ODBC требует, чтобы все драйверы поддерживали преобразование SQL_CHAR или SQL_VARCHAR типа данных во все типы данных интервала C. Если базовый источник данных не поддерживает типы данных интервала, драйвер должен знать правильный формат значения в поле SQL_CHAR для поддержки этих преобразований. Аналогичным образом, ODBC требует, чтобы любой тип ODBC C был преобразован в SQL_CHAR или SQL_VARCHAR, поэтому драйверу необходимо знать, какой формат должен иметь интервал, хранящийся в поле символа. В этом разделе описывается синтаксис литералов интервала, который модуль записи драйверов должен использовать для проверки полей SQL_CHAR во время преобразования в типы данных интервала C или из них.

Примечание.

Полный синтаксис BNF для литералов интервалов показан в разделе "Синтаксис литералов интервала" в приложении C: грамматика SQL.

Для передачи литералы интервала в рамках инструкции SQL синтаксис предложения escape определяется для литералы интервала. Дополнительные сведения см. в разделе "Литералы даты", "Время" и "Метка времени".

Литерал интервала имеет форму:

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

где "INTERVAL" указывает, что символьный литерал является интервалом. Знак может быть либо плюсом, либо минусом; он находится вне строки интервала и является необязательным.

Квалификатор интервала может быть одним полем datetime или состоять из двух полей даты и времени в форме: <в начале поля> В <конечный пол>.

  • Если интервал состоит из одного поля, одно поле может быть не вторым полем, которое может сопровождаться необязательной начальной точностью в скобках. Одно поле datetime также может быть вторым полем, которое может сопровождаться необязательной начальной точностью, необязательной точностью дробных секунд в скобках или обоими. Если в поле секунды присутствует как начальная точность, так и точность дробных секунд, они разделены запятыми. Если поле секунд имеет точность дробных секунд, она также должна иметь ведущую точность.

  • Если интервал состоит из начальных и конечных полей, ведущее поле является не вторым полем, которое может сопровождаться точностью начального поля интервала в скобках. Поле тропицы может быть либо не вторым, либо вторым полем, которое может сопровождаться точностью интервала дробных секунд в скобках.

Строка интервала в значении заключена в одинарные кавычки. Это может быть литерал года или дневной литерал. Формат строки в значении определяется следующими правилами:

  • Строка содержит десятичное значение для каждого поля, подразумеваемого квалификатором интервала<. >

  • Если точность интервала включает поля YEAR и MONTH, значения этих полей разделяются знаком минуса.

  • Если точность интервала включает поля DAY и HOUR, значения этих полей разделяются пробелом.

  • Если точность интервала включает поле HOUR и поля нижнего порядка (MINUTE и SECOND), значения этих полей разделяются двоеточием.

  • Если точность интервала включает в себя второе поле, а выраженная или подразумеваемая точность секунд не является ненулевой, символ непосредственно перед первой цифрой дробной части второй является периодом.

  • Не может быть больше двух цифр, кроме следующих:

    • Значение ведущего поля может быть до тех пор, пока выраженная или подразумеваемая точность интервала.

    • Дробная часть второго поля может быть до тех пор, пока выраженная или подразумеваемая точность секунд.

    • Конечные поля соответствуют обычным ограничениям григорианского календаря. (См. раздел Ограничения григорианского календаря.)

В следующей таблице перечислены примеры допустимых литералы интервалов, включенные в предложение ESCAPE ODBC для интервалов. Синтаксис предложения escape выглядит следующим образом:

Примечание.

{INTERVAL sign interval-string interval-qualifier}

Предложение escape-символа литерала Указанный интервал
{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.

В следующей таблице перечислены примеры недопустимых литералы интервалов:

Предложение escape-символа литерала Причина, по которой недопустимо
{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. Литерал имеет семь цифр после десятичной запятой.
{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)}
Конечная область не соответствует правилам григорианского календаря.