Valori letterali intervallo

ODBC richiede che tutti i driver supportino la conversione del tipo di dati SQL_CHAR o SQL_VARCHAR in tutti i tipi di dati intervallo C. Se l'origine dati sottostante non supporta i tipi di dati interval, tuttavia, il driver deve conoscere il formato corretto del valore nel campo SQL_CHAR per supportare queste conversioni. Analogamente, ODBC richiede che qualsiasi tipo ODBC C sia convertibile in SQL_CHAR o SQL_VARCHAR, pertanto un driver deve conoscere il formato di un intervallo archiviato nel campo carattere. In questa sezione viene descritta la sintassi dei valori letterali intervallo, che il writer del driver deve usare per convalidare i campi SQL_CHAR durante la conversione da o verso tipi di dati intervallo C.

Nota

La sintassi BNF completa per i valori letterali intervallo è illustrata nella sezione Sintassi letterale intervallo nell'Appendice C: Grammatica SQL.

Per passare valori letterali intervallo come parte di un'istruzione SQL, viene definita una sintassi di clausola di escape per i valori letterali intervallo. Per altre informazioni, vedere Valori letterali data, ora e timestamp.

Un valore letterale intervallo è del formato:

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

dove "INTERVAL" indica che il valore letterale carattere è un intervallo. Il segno può essere più o meno; si trova all'esterno della stringa di intervallo ed è facoltativo.

Il qualificatore di intervallo può essere un singolo campo datetime o essere composto da due campi datetime, nel formato: <campo> iniziale TO <finale.>

  • Quando l'intervallo è composto da un singolo campo, il singolo campo può essere un campo non secondo che può essere accompagnato da una precisione iniziale facoltativa tra parentesi. Il singolo campo datetime può anche essere un secondo campo che può essere accompagnato dalla precisione iniziale facoltativa, dalla precisione frazionaria facoltativa in secondi tra parentesi o da entrambi. Se una precisione iniziale e una precisione frazionaria in secondi sono presenti per un campo di secondi, sono separate da virgole. Se il campo secondi ha una precisione frazionaria in secondi, deve avere anche una precisione iniziale.

  • Quando l'intervallo è composto da campi iniziali e finali, il campo iniziale è un campo non secondo che può essere accompagnato dalla precisione del campo iniziale intervallo tra parentesi. Il campo finale può essere un campo non secondo o un secondo campo che può essere accompagnato da una precisione frazionaria di secondi tra parentesi.

La stringa di intervallo nel valore è racchiusa tra virgolette singole. Può essere un valore letterale anno-mese o un valore letterale di ora del giorno. Il formato della stringa nel valore è determinato dalle regole seguenti:

  • La stringa contiene un valore decimale per ogni campo implicito dal qualificatore intervallo<.>

  • Se la precisione dell'intervallo include i campi YEAR e MONTH, i valori di questi campi sono separati da un segno meno.

  • Se la precisione dell'intervallo include i campi DAY e HOUR, i valori di questi campi sono separati da uno spazio.

  • Se la precisione dell'intervallo include il campo HOUR e i campi dell'ordine inferiore (MINUTE e SECOND), i valori di questi campi sono separati da due punti.

  • Se la precisione dell'intervallo include un campo SECOND e la precisione espressa o implicita dei secondi è diversa da zero, il carattere immediatamente prima della prima cifra della parte frazionaria del secondo è un punto.

  • Nessun campo può essere composto da più di due cifre, ad eccezione di:

    • Il valore del campo iniziale può essere fino a quando la precisione iniziale espressa o implicita dell'intervallo.

    • La parte frazionaria del campo SECOND può essere a condizione che la precisione espressa o implicita dei secondi.

    • I campi finali seguono i soliti vincoli del calendario gregoriano. (Vedere Vincoli del calendario gregoriano.

Nella tabella seguente sono elencati esempi di valori letterali intervallo validi inclusi nella clausola di escape ODBC per gli intervalli. La sintassi della clausola escape è la seguente:

Nota

{INTERVAL sign interval-string interval-qualifier}

Clausola di escape letterale Intervallo specificato
{INTERVAL '326' YEAR(4)} Specifica un intervallo di 326 anni. La precisione iniziale dell'intervallo è 4.
{INTERVAL '326' MONTH(3)} Specifica un intervallo di 326 mesi. La precisione iniziale dell'intervallo è 3.
{INTERVAL '3261' DAY(4)} Specifica un intervallo di 3261 giorni. La precisione iniziale dell'intervallo è 4.
{INTERVAL '163' HOUR(3)} Specifica un intervallo di 163 giorni. La precisione iniziale dell'intervallo è 3.
{INTERVAL '163' MINUTE(3)} Specifica un intervallo di 163 minuti. La precisione iniziale dell'intervallo è 3.
{INTERVAL '223.16' SECOND(3,2)} Specifica un intervallo di 223,16 secondi. La precisione iniziale dell'intervallo è 3 e la precisione dei secondi è 2.
{INTERVAL '163-11' YEAR(3) TO MONTH} Specifica un intervallo di 163 anni e 11 mesi. La precisione iniziale dell'intervallo è 3.
{INTERVAL '163 12' DAY(3) TO HOUR} Specifica un intervallo di 163 giorni e 12 ore. La precisione iniziale dell'intervallo è 3.
{INTERVAL '163 12:39' DAY(3) TO MINUTE} Specifica un intervallo di 163 giorni, 12 ore e 39 minuti. La precisione iniziale dell'intervallo è 3.
{INTERVAL '163 12:39:59.163' DAY(3) TO SECOND(3)} Specifica un intervallo di 163 giorni, 12 ore, 39 minuti e 59,163 secondi. La precisione iniziale dell'intervallo è 3 e la precisione dei secondi è 3.
{INTERVAL '163:39' HOUR(3) TO MINUTE} Specifica un intervallo di 163 ore e 39 minuti. La precisione iniziale dell'intervallo è 3.
{INTERVAL '163:39:59.163' HOUR(3) TO SECOND(4)} Specifica un intervallo di 163 ore, 39 minuti e 59,163 secondi. La precisione iniziale dell'intervallo è 3 e la precisione dei secondi è 4.
{INTERVAL '163:59.163' MINUTE(3) TO SECOND(5)} Specifica un intervallo di 163 minuti e 59,163 secondi. La precisione iniziale dell'intervallo è 3 e la precisione dei secondi è 5.
{INTERVAL -'16 23:39:56.23' DAY TO SECOND} Specifica un intervallo di meno 16 giorni, 23 ore, 39 minuti e 56,23 secondi. La precisione iniziale implicita è 2 e la precisione implicita dei secondi è 6.

Nella tabella seguente sono elencati esempi di valori letterali intervallo non validi:

Clausola di escape letterale Motivo per cui non è valido
{INTERVAL '163' HOUR(2)} La precisione iniziale dell'intervallo è 2, ma il valore del campo iniziale è 163.
{INTERVAL '223.16' SECOND(2,2)}

{INTERVAL '223.16' SECOND(3,1)}
Nel primo esempio la precisione iniziale è troppo piccola e, nel secondo esempio, la precisione dei secondi è troppo piccola.
{INTERVAL '223.16' SECOND}

{INTERVAL '223' YEAR}
Poiché la precisione iniziale non è specificata, il valore predefinito è 2, che è troppo piccolo per contenere il valore letterale specificato.
{INTERVAL '22.1234567' SECOND} La precisione dei secondi non è specificata, quindi per impostazione predefinita è 6. Il valore letterale ha sette cifre dopo il separatore decimale.
{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)}
Il campo finale non segue le regole del calendario gregoriano.