Литералы интервала
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)} |
Конечная область не соответствует правилам григорианского календаря. |