Valori letterali intervallo

ODBC richiede che tutti i driver supportino la conversione del tipo SQL_CHAR o SQL_VARCHAR dati in tutti i tipi di dati dell'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 in o da tipi di dati intervallo C.

Nota

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

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

Un valore letterale intervallo ha il formato seguente:

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

dove "INTERVAL" indica che il valore letterale carattere è un intervallo. Il segno può essere più o meno; non è compreso nella stringa dell'intervallo ed è facoltativo.

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

  • Quando l'intervallo è costituito da un singolo campo, il singolo campo può essere un campo diverso da 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 dei secondi facoltativa tra parentesi o da entrambe. Se per un campo secondi sono presenti sia una precisione iniziale che una precisione frazionaria dei secondi, vengono separate da virgole. Se il campo secondi ha una precisione frazionaria dei secondi, deve avere anche una precisione iniziale.

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

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

  • La stringa contiene un valore decimale per ogni campo implicito da <interval qualifier> .

  • 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 di 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 dei secondi espressa o implicita è diversa da zero, il carattere immediatamente precedente alla prima cifra della parte frazionaria della seconda è un punto.

  • Nessun campo può contenere più di due cifre, ad eccezione di:

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

    • La parte frazionaria del campo SECOND può essere lunga quanto la precisione dei secondi espressa o implicita.

    • I campi finali seguono i vincoli consueti 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 di 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 in 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 in 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 in secondi implicita è 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 il valore predefinito è 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.