Literais de intervalo
O ODBC requer que todos os drivers ofereçam suporte à conversão do tipo de dados SQL_CHAR ou SQL_VARCHAR para todos os tipos de dados de intervalo C. No entanto, se a fonte de dados subjacente não der suporte a tipos de dados de intervalo, o driver precisará saber o formato correto do valor no campo SQL_CHAR para dar suporte a essas conversões. Da mesma forma, o ODBC exige que qualquer tipo C ODBC seja conversível em SQL_CHAR ou SQL_VARCHAR, portanto, um driver precisa saber qual formato um intervalo armazenado no campo de caractere deve ter. Esta seção descreve a sintaxe de literais de intervalo, que o gravador de driver precisa usar para validar os campos de SQL_CHAR durante a conversão de ou para tipos de dados de intervalo C.
Observação
A sintaxe BNF completa para literais de intervalo é mostrada na seção Sintaxe Literal de Intervalo no Apêndice C: Gramática SQL.
Para passar literais de intervalo como parte de uma instrução SQL, uma sintaxe de cláusula de escape é definida para literais de intervalo. Para obter mais informações, consulte Literais de Data, Hora e Carimbo de data/hora.
Um literal de intervalo tem o formato:
INTERVAL[<sign>] 'value' <interval qualifier>
onde "INTERVAL" indica que o literal de caractere é um intervalo. O sinal pode ser mais ou menos; ele está fora da cadeia de caracteres de intervalo e é opcional.
O qualificador de intervalo pode ser um único campo de data/hora ou ser composto por dois campos de data/hora, no formato: <campo> à esquerda TO <campo> à direita.
Quando o intervalo é composto por um único campo, o campo único pode ser um campo que não é um segundo que pode ser acompanhado por uma precisão de entrelinha opcional entre parênteses. O campo datetime único também pode ser um segundo campo que pode ser acompanhado pela precisão opcional à esquerda, pela precisão opcional de frações de segundos entre parênteses ou por ambas. Se uma precisão principal e uma precisão de fração de segundo estiverem presentes para um campo de segundos, elas serão separadas por vírgulas. Se o campo de segundos tiver uma precisão de frações de segundos, ele também deverá ter uma precisão de entrelinha.
Quando o intervalo é composto de campos à esquerda e à direita, o campo à esquerda é um campo que não é um segundo que pode ser acompanhado pela precisão do campo à esquerda do intervalo entre parênteses. O campo à direita pode ser um campo que não seja um segundo ou um segundo campo que pode ser acompanhado por uma precisão de frações de segundos de intervalo entre parênteses.
A cadeia de caracteres de intervalo no valor é colocada entre aspas simples. Pode ser um literal ano-mês ou um literal diurno. O formato da cadeia de caracteres em valor é determinado pelas seguintes regras:
A cadeia de caracteres contém um valor decimal para cada campo implícito no <qualificador de intervalo>.
Se a precisão do intervalo incluir os campos ANO e MÊS, os valores desses campos serão separados por um sinal de menos.
Se a precisão do intervalo incluir os campos DIA e HORA, os valores desses campos serão separados por um espaço.
Se a precisão do intervalo incluir o campo HOUR e os campos de ordem inferior (MINUTE e SECOND), os valores desses campos serão separados por dois-pontos.
Se a precisão do intervalo incluir um campo SECOND e a precisão de segundos expressa ou implícita for diferente de zero, o caractere imediatamente antes do primeiro dígito da parte fracionária do segundo será um ponto.
Nenhum campo pode ter mais de dois dígitos, exceto:
O valor do campo principal pode ser tão longo quanto a precisão principal do intervalo expressa ou implícita.
A parte fracionária do campo SECOND pode ser tão longa quanto a precisão de segundos expressa ou implícita.
Os campos à direita seguem as restrições usuais do calendário gregoriano. (Veja Restrições do calendário gregoriano.)
A tabela a seguir lista exemplos de literais de intervalo válidos, conforme incluído na cláusula de escape ODBC para intervalos. A sintaxe da cláusula de escape é a seguinte:
Observação
{Sinal de intervalo intervalo-string intervalo-qualificador}
Cláusula de escape literal | Intervalo especificado |
---|---|
{INTERVALO '326' ANO(4)} | Especifica um intervalo de 326 anos. A precisão de entrelinha do intervalo é 4. |
{INTERVALO '326' MÊS(3)} | Especifica um intervalo de 326 meses. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '3261' DIA(4)} | Especifica um intervalo de 3261 dias. A precisão de entrelinha do intervalo é 4. |
{INTERVALO '163' HORA(3)} | Especifica um intervalo de 163 dias. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '163' MINUTO(3)} | Especifica um intervalo de 163 minutos. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '223,16' SEGUNDO(3,2)} | Especifica um intervalo de 223,16 segundos. A precisão do intervalo à esquerda é 3 e a precisão dos segundos é 2. |
{INTERVALO '163-11' ANO(3) PARA MÊS} | Especifica um intervalo de 163 anos e 11 meses. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '163 12' DIA(3) A HORA} | Especifica um intervalo de 163 dias e 12 horas. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '163 12:39' DIA(3) PARA MINUTO} | Especifica um intervalo de 163 dias, 12 horas e 39 minutos. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '163 12:39:59.163' DIA(3) PARA SEGUNDO(3)} | Especifica um intervalo de 163 dias, 12 horas, 39 minutos e 59,163 segundos. A precisão da entrelinha do intervalo é 3 e a precisão dos segundos é 3. |
{INTERVALO '163:39' HORA(3) A MINUTO} | Especifica um intervalo de 163 horas e 39 minutos. A precisão de entrelinha do intervalo é 3. |
{INTERVALO '163:39:59.163' HORA (3) PARA SEGUNDO (4)} | Especifica um intervalo de 163 horas, 39 minutos e 59,163 segundos. A precisão do intervalo principal é 3 e a precisão dos segundos é 4. |
{INTERVALO '163:59.163' MINUTO (3) PARA SEGUNDO (5)} | Especifica um intervalo de 163 minutos e 59,163 segundos. A precisão do intervalo principal é 3 e a precisão dos segundos é 5. |
{INTERVALO -'16 23:39:56.23' DIA PARA O SEGUNDO} | Especifica um intervalo de menos 16 dias, 23 horas, 39 minutos e 56,23 segundos. A precisão implícita da entrelinha é 2 e a precisão implícita dos segundos é 6. |
A tabela a seguir lista exemplos de literais de intervalo inválidos:
Cláusula de escape literal | Razão pela qual inválido |
---|---|
{INTERVALO '163' HORA(2)} | A precisão da entrelinha do intervalo é 2, mas o valor do campo da entrelinha é 163. |
{INTERVALO '223,16' SEGUNDO(2,2)} {INTERVALO '223,16' SEGUNDO(3,1)} |
No primeiro exemplo, a precisão principal é muito pequena e, no segundo exemplo, a precisão dos segundos é muito pequena. |
{INTERVALO '223,16' SEGUNDO} {INTERVALO '223' ANO} |
Como a precisão principal não é especificada, o padrão é 2, que é muito pequeno para conter o literal especificado. |
{INTERVALO '22,1234567' SEGUNDO} | A precisão de segundos não é especificada, portanto, o padrão é 6. O literal tem sete dígitos após o ponto decimal. |
{INTERVALO '163-13' ANO(3) PARA MÊS} {INTERVALO '163 65' DIA(3) A HORA} {INTERVALO '163 62:39' DIA(3) A MINUTO} {INTERVALO '163 12:125:59.163' DIA(3) PARA SEGUNDO(3)} {INTERVALO '163:144' HORA(3) PARA MINUTO} {INTERVALO '163:567:234.163' HORA(3) PARA SEGUNDO(4)} {INTERVALO '163:591.163' MINUTO(3) PARA SEGUNDO(5)} |
O campo final não segue as regras do calendário gregoriano. |