Intervallliterale
ODBC erfordert, dass alle Treiber die Konvertierung des SQL_CHAR- oder SQL_VARCHAR Datentyps in alle C-Intervalldatentypen unterstützen. Wenn die zugrunde liegende Datenquelle jedoch keine Intervalldatentypen unterstützt, muss der Treiber das richtige Format des Werts im Feld SQL_CHAR kennen, um diese Konvertierungen zu unterstützen. Ebenso erfordert ODBC, dass jeder ODBC-C-Typ in SQL_CHAR oder SQL_VARCHAR konvertierbar sein muss. Daher muss ein Treiber wissen, welches Format ein im Zeichenfeld gespeichertes Intervall aufweisen sollte. In diesem Abschnitt wird die Syntax von Intervallliteralen beschrieben, die der Treiberschreiber verwenden muss, um die SQL_CHAR Felder während der Konvertierung in oder aus C-Intervall-Datentypen zu überprüfen.
Hinweis
Die vollständige BNF-Syntax für Intervallliterale wird im Abschnitt Intervallliteralsyntax in Anhang C: SQL Grammar gezeigt.
Um Intervallliterale als Teil einer SQL-Anweisung zu übergeben, wird eine Escapeklauselsyntax für Intervallliterale definiert. Weitere Informationen finden Sie unter Datums-, Uhrzeit- und Zeitstempelliteralen.
Ein Intervallliteral weist die Form auf:
INTERVAL[<sign>] 'value' <interval qualifier>
wobei "INTERVAL" angibt, dass das Zeichenliteral ein Intervall ist. Das Zeichen kann entweder Plus- oder Minuszeichen sein; sie befindet sich außerhalb der Intervallzeichenfolge und ist optional.
Der Intervallqualifizierer kann entweder ein einzelnes Datetime-Feld sein oder aus zwei Datums-/Uhrzeitfeldern bestehen, in der Form: <führendes Feld des nachgestellten Felds>> TO.<
Wenn das Intervall aus einem einzelnen Feld besteht, kann das einzelne Feld ein nicht zweites Feld sein, das von einer optionalen führenden Genauigkeit in Klammern begleitet werden kann. Das einzelne Datetime-Feld kann auch ein zweites Feld sein, das von der optionalen führenden Genauigkeit, der optionalen Genauigkeit von Bruchzahlen in Klammern oder beidem begleitet werden kann. Wenn sowohl eine führende Genauigkeit als auch eine Bruch sekundenpräzision für ein Sekundenfeld vorhanden sind, werden sie durch Kommas getrennt. Wenn das Sekundenfeld eine Bruchzahl-Sekunden-Genauigkeit aufweist, muss es auch eine führende Genauigkeit aufweisen.
Wenn das Intervall aus führenden und nachgestellten Feldern besteht, ist das führende Feld ein nicht zweites Feld, das von der Intervallführenden Feldgenauigkeit in Klammern begleitet werden kann. Das nachfolgende Feld kann entweder ein Nicht-Second-Feld oder ein zweites Feld sein, das von einer Intervallbruchsekundengenauigkeit in Klammern begleitet werden kann.
Die Intervallzeichenfolge im Wert wird in einfache Anführungszeichen eingeschlossen. Es kann sich entweder um ein Literal im Jahr oder um ein Literal der Tageszeit sein. Das Format der Zeichenfolge im Wert wird durch die folgenden Regeln bestimmt:
Die Zeichenfolge enthält einen Dezimalwert für jedes Feld, das vom <Intervallqualifizierer >impliziert wird.
Wenn die Intervallgenauigkeit die Felder JAHR und MONAT enthält, werden die Werte dieser Felder durch ein Minuszeichen getrennt.
Wenn die Intervallgenauigkeit die Felder DAY und HOUR enthält, werden die Werte dieser Felder durch ein Leerzeichen getrennt.
Wenn die Intervallgenauigkeit das Feld HOUR und die niedrigeren Reihenfolgenfelder (MINUTE und SEKUNDE) enthält, werden die Werte dieser Felder durch einen Doppelpunkt getrennt.
Wenn die Intervallgenauigkeit ein SECOND-Feld enthält und die ausgedrückte oder implizierte Sekundengenauigkeit ungleich Null ist, ist das Zeichen unmittelbar vor der ersten Ziffer des Bruchteils der sekunde ein Punkt.
Kein Feld darf mehr als zwei Ziffern lang sein, außer:
Der Wert des führenden Felds kann so lange sein, wie die ausgedrückte oder implizierte Intervallpräzision.
Der Bruchteil des ZWEITEN Felds kann so lange sein, wie die ausgedrückte oder implizierte Sekundengenauigkeit.
Die nachfolgenden Felder folgen den üblichen Einschränkungen des gregorianischen Kalenders. (Siehe Einschränkungen des gregorianischen Kalenders.)
In der folgenden Tabelle sind Beispiele für gültige Intervallliterale aufgeführt, die in der ODBC-Escapeklausel für Intervalle enthalten sind. Die Syntax der Escapeklausel lautet wie folgt:
Hinweis
{INTERVAL-Sign interval-string interval-qualifier}
Literale Escapeklausel | Angegebenes Intervall |
---|---|
{INTERVAL '326' JAHR(4)} | Gibt ein Intervall von 326 Jahren an. Die Intervallpräzision ist 4. |
{INTERVAL '326' MONAT(3)} | Gibt ein Intervall von 326 Monaten an. Die Intervallpräzision ist 3. |
{INTERVAL '3261' DAY(4)} | Gibt ein Intervall von 3261 Tagen an. Die Intervallpräzision ist 4. |
{INTERVAL '163' HOUR(3)} | Gibt ein Intervall von 163 Tagen an. Die Intervallpräzision ist 3. |
{INTERVAL '163' MINUTE(3)} | Gibt ein Intervall von 163 Minuten an. Die Intervallpräzision ist 3. |
{INTERVAL '223.16' SEKUNDE(3,2)} | Gibt ein Intervall von 223,16 Sekunden an. Die Intervallpräzision ist 3, und die Sekundengenauigkeit ist 2. |
{INTERVAL '163-11' JAHR(3) BIS MONAT} | Gibt ein Intervall von 163 Jahren und 11 Monaten an. Die Intervallpräzision ist 3. |
{INTERVAL '163 12' DAY(3) TO HOUR} | Gibt ein Intervall von 163 Tagen und 12 Stunden an. Die Intervallpräzision ist 3. |
{INTERVAL '163 12:39' DAY(3) TO MINUTE} | Gibt ein Intervall von 163 Tagen, 12 Stunden und 39 Minuten an. Die Intervallpräzision ist 3. |
{INTERVAL '163 12:39:59.163' DAY(3) TO SECOND(3)} | Gibt ein Intervall von 163 Tagen, 12 Stunden, 39 Minuten und 59,163 Sekunden an. Die Intervallpräzision ist 3, und die Sekundengenauigkeit ist 3. |
{INTERVAL '163:39' HOUR(3) TO MINUTE} | Gibt ein Intervall von 163 Stunden und 39 Minuten an. Die Intervallpräzision ist 3. |
{INTERVAL '163:39:59.163' HOUR(3) TO SECOND(4)} | Gibt ein Intervall von 163 Stunden, 39 Minuten und 59,163 Sekunden an. Die Intervallpräzision ist 3, und die Sekundengenauigkeit beträgt 4. |
{INTERVAL '163:59.163' MINUTE(3) BIS SEKUNDE(5)} | Gibt ein Intervall von 163 Minuten und 59,163 Sekunden an. Die Intervallpräzision ist 3, und die Sekundengenauigkeit ist 5. |
{INTERVAL -'16 23:39:56.23' TAG BIS SEKUNDE} | Gibt ein Intervall von minus 16 Tagen, 23 Stunden, 39 Minuten und 56,23 Sekunden an. Die implizierte führende Genauigkeit ist 2, und die implizite Sekundengenauigkeit ist 6. |
In der folgenden Tabelle sind Beispiele für ungültige Intervallliterale aufgeführt:
Literale Escapeklausel | Grund, warum ungültig |
---|---|
{INTERVAL '163' HOUR(2)} | Die Intervallpräzision ist 2, der Wert des führenden Felds ist jedoch 163. |
{INTERVAL '223.16' SEKUNDE(2,2)} {INTERVAL '223.16' SEKUNDE(3,1)} |
Im ersten Beispiel ist die führende Genauigkeit zu klein, und im zweiten Beispiel ist die Sekundengenauigkeit zu klein. |
{INTERVAL '223.16' SECOND} {INTERVAL '223' JAHR} |
Da die führende Genauigkeit nicht angegeben ist, wird standardmäßig 2 verwendet, was zu klein ist, um das angegebene Literal zu halten. |
{INTERVAL '22.1234567' SECOND} | Die Sekundengenauigkeit ist nicht angegeben, sodass sie standardmäßig auf 6 festgelegt ist. Das Literal weist sieben Ziffern nach dem Dezimalkomma auf. |
{INTERVAL '163-13' JAHR(3) BIS MONAT} {INTERVALL '163 65' TAG(3) BIS STUNDE} {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) BIS SEKUNDE(5)} |
Das nachfolgende Feld entspricht nicht den Regeln des gregorianischen Kalenders. |