Compartir a través de


Literales de intervalo

ODBC requiere que todos los controladores admitan la conversión del tipo de datos SQL_CHAR o SQL_VARCHAR a todos los tipos de datos de intervalo de C. Sin embargo, si el origen de datos subyacente no admite tipos de datos de intervalo, el controlador debe conocer el formato correcto del valor en el campo SQL_CHAR para admitir estas conversiones. De forma similar, ODBC requiere que cualquier tipo de C ODBC pueda convertirse en SQL_CHAR o SQL_VARCHAR, por lo que un controlador debe saber qué formato debe tener un intervalo almacenado en el campo de caracteres. En esta sección se describe la sintaxis de los literales de intervalo, que el escritor de controladores debe usar para validar los campos de SQL_CHAR durante la conversión a o desde tipos de datos de intervalo de C.

Nota:

La sintaxis completa de BNF para los literales de intervalo se muestra en la sección Sintaxis literal de intervalo en el Apéndice C: Gramática SQL.

Para pasar literales de intervalo como parte de una instrucción SQL, se define una sintaxis de cláusula de escape para literales de intervalo. Para obtener más información, vea Literales de fecha, hora y marca de tiempo.

Un literal de intervalo tiene el formato :

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

donde "INTERVAL" indica que el literal de carácter es un intervalo. El signo puede ser más o menos; está fuera de la cadena de intervalo y es opcional.

El calificador de intervalo puede ser un único campo datetime o estar compuesto de dos campos datetime, en el formulario: <campo> inicial AL< campo> final.

  • Cuando el intervalo se compone de un solo campo, el único campo puede ser un campo distinto de segundo que pueda ir acompañado de una precisión inicial opcional entre paréntesis. El campo datetime único también puede ser un segundo campo que puede ir acompañado de la precisión inicial opcional, la precisión opcional fracciones de segundos entre paréntesis o ambas. Si una precisión inicial y una precisión de fracciones de segundos están presentes durante un campo de segundos, se separan por comas. Si el campo de segundos tiene una precisión de fracciones de segundos, también debe tener una precisión inicial.

  • Cuando el intervalo se compone de campos iniciales y finales, el campo inicial es un campo distinto de segundo que puede ir acompañado de la precisión del campo inicial del intervalo entre paréntesis. El campo final puede ser un campo distinto de un segundo o un segundo campo que pueda ir acompañado de una precisión de fracciones de segundos de intervalo entre paréntesis.

La cadena de intervalo en el valor se incluye entre comillas simples. Puede ser un literal de mes o un literal de día. El formato de la cadena en valor viene determinado por las reglas siguientes:

  • La cadena contiene un valor decimal para cada campo implícito en el calificador> de <intervalo.

  • Si la precisión del intervalo incluye los campos YEAR y MONTH, los valores de estos campos se separan mediante un signo menos.

  • Si la precisión del intervalo incluye los campos DAY y HOUR, los valores de estos campos están separados por un espacio.

  • Si la precisión del intervalo incluye el campo HOUR y los campos de orden inferior (MINUTO y SEGUNDO), los valores de estos campos están separados por dos puntos.

  • Si la precisión del intervalo incluye un campo SECOND y la precisión expresada o implícita de segundos es distinto de cero, el carácter inmediatamente antes del primer dígito de la parte fraccionaria del segundo es un punto.

  • Ningún campo puede tener más de dos dígitos de longitud, excepto:

    • El valor del campo inicial puede ser siempre que la precisión inicial del intervalo expresado o implícito.

    • La parte fraccionaria del campo SECOND puede ser siempre que la precisión expresada o implícita de segundos.

    • Los campos finales siguen las restricciones habituales del calendario gregoriano. (Consulte Restricciones del calendario gregoriano).

En la tabla siguiente se enumeran ejemplos de literales de intervalo válidos, como se incluye en la cláusula de escape ODBC para intervalos. La sintaxis de la cláusula de escape es la siguiente:

Nota:

{INTERVAL sign interval-string interval-qualifier}

Cláusula de escape literal Intervalo especificado
{INTERVAL '326' YEAR(4)} Especifica un intervalo de 326 años. La precisión inicial del intervalo es 4.
{INTERVAL '326' MONTH(3)} Especifica un intervalo de 326 meses. La precisión inicial del intervalo es 3.
{INTERVAL '3261' DAY(4)} Especifica un intervalo de 3261 días. La precisión inicial del intervalo es 4.
{INTERVAL '163' HOUR(3)} Especifica un intervalo de 163 días. La precisión inicial del intervalo es 3.
{INTERVAL '163' MINUTE(3)} Especifica un intervalo de 163 minutos. La precisión inicial del intervalo es 3.
{INTERVAL '223.16' SECOND(3,2)} Especifica un intervalo de 223,16 segundos. La precisión inicial del intervalo es 3 y la precisión de segundos es 2.
{INTERVAL '163-11' YEAR(3) TO MONTH} Especifica un intervalo de 163 años y 11 meses. La precisión inicial del intervalo es 3.
{INTERVAL '163 12' DAY(3) TO HOUR} Especifica un intervalo de 163 días y 12 horas. La precisión inicial del intervalo es 3.
{INTERVAL '163 12:39' DAY(3) TO MINUTE} Especifica un intervalo de 163 días, 12 horas y 39 minutos. La precisión inicial del intervalo es 3.
{INTERVAL '163 12:39:59.163' DAY(3) TO SECOND(3)} Especifica un intervalo de 163 días, 12 horas, 39 minutos y 59,163 segundos. La precisión inicial del intervalo es 3 y la precisión de segundos es 3.
{INTERVAL '163:39' HOUR(3) TO MINUTE} Especifica un intervalo de 163 horas y 39 minutos. La precisión inicial del intervalo es 3.
{INTERVAL '163:39:59.163' HOUR(3) TO SECOND(4)} Especifica un intervalo de 163 horas, 39 minutos y 59,163 segundos. La precisión inicial del intervalo es 3 y la precisión de segundos es 4.
{INTERVAL '163:59.163' MINUTE(3) TO SECOND(5)} Especifica un intervalo de 163 minutos y 59,163 segundos. La precisión inicial del intervalo es 3 y la precisión de segundos es 5.
{INTERVAL -'16 23:39:56.23' DAY TO SECOND} Especifica un intervalo de menos 16 días, 23 horas, 39 minutos y 56,23 segundos. La precisión inicial implícita es 2 y la precisión implícita de segundos es 6.

En la tabla siguiente se enumeran ejemplos de literales de intervalo no válidos:

Cláusula de escape literal Motivo por el que no es válido
{INTERVAL '163' HOUR(2)} La precisión inicial del intervalo es 2, pero el valor del campo inicial es 163.
{INTERVAL '223.16' SECOND(2,2)}

{INTERVAL '223.16' SECOND(3,1)}
En el primer ejemplo, la precisión inicial es demasiado pequeña y, en el segundo ejemplo, la precisión de segundos es demasiado pequeña.
{INTERVAL '223.16' SECOND}

{INTERVAL '223' YEAR}
Dado que la precisión inicial no está especificada, el valor predeterminado es 2, que es demasiado pequeño para contener el literal especificado.
{INTERVAL '22.1234567' SECOND} La precisión de segundos no está especificada, por lo que el valor predeterminado es 6. El literal tiene siete dígitos después del separador decimal.
{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)}
El campo final no sigue las reglas del calendario gregoriano.