Teilen über


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 konvertiert werden muss, sodass ein Treiber wissen muss, welches Format ein im Zeichenfeld gespeichertes Intervall haben soll. In diesem Abschnitt wird die Syntax der Intervallliterale beschrieben, die der Treiberwriter verwenden muss, um die SQL_CHAR Felder während der Konvertierung in oder aus C-Intervalldatentypen zu überprüfen.

Hinweis

Die vollständige BNF-Syntax für Intervallliterale finden Sie im Abschnitt Intervallliteralsyntax in Anhang C: SQL-Grammatik.

Um Intervallliterale als Teil einer SQL-Anweisung zu übergeben, wird eine Escapeklauselsyntax für Intervallliterale definiert. Weitere Informationen finden Sie unter Datums-, Uhrzeit- und Zeitstempelliterale.

Ein Intervallliteral hat folgende Form:

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

Wobei "INTERVAL" angibt, dass das Zeichenliteral ein Intervall ist. Das Vorzeichen kann entweder plus oder minus sein. sie liegt außerhalb der Intervallzeichenfolge und ist optional.

Der Intervallqualifizierer kann entweder ein einzelnes datetime-Feld sein oder aus zwei datetime-Feldern im Format: <führendes Feld>TO-Nachgestelltes< Feld >bestehen.

  • 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 Sekundenbruchteilen in Klammern oder beidem begleitet werden kann. Wenn sowohl eine führende Genauigkeit als auch eine Genauigkeit in Sekundenbruchteilen für ein Sekundenfeld vorhanden sind, werden sie durch Kommas getrennt. Wenn das Sekundenfeld eine Genauigkeit von Sekundenbruchteilen aufweist, muss es auch über eine führende Genauigkeit verfügen.

  • Wenn das Intervall aus führenden und nachgestellten Feldern besteht, ist das führende Feld ein Nicht-Sekunde-Feld, das von der Genauigkeit des intervallführenden Felds in Klammern begleitet werden kann. Das nachgestellte Feld kann entweder ein feld ohne Sekunde oder ein zweites Feld sein, das von einer Genauigkeit von Sekundenbruchteilen in Klammern begleitet werden kann.

Die Intervallzeichenfolge im Wert wird in einfache Anführungszeichen eingeschlossen. Es kann sich entweder um ein Jahresmonatsliteral oder um ein Tag-Zeit-Literal 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 YEAR und MONTH 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 Felder in niedrigerer Reihenfolge (MINUTE und SECOND) enthält, werden die Werte dieser Felder durch einen Doppelpunkt getrennt.

  • Wenn die Intervallgenauigkeit ein ZWEITES Feld enthält und die Genauigkeit der ausgedrückten oder implizierten Sekunden ungleich null ist, ist das Zeichen unmittelbar vor der ersten Ziffer des Sekundenbruchteils 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 Intervallführungsgenauigkeit ist.

    • Der bruchteilale Teil des ZWEITEN Felds kann so lang sein, wie die genauigkeit der ausgedrückten oder implizierten Sekunden.

    • 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' YEAR(4)} Gibt ein Intervall von 326 Jahren an. Die Intervallführungsgenauigkeit beträgt 4.
{INTERVAL '326' MONTH(3)} Gibt ein Intervall von 326 Monaten an. Die Intervallführungsgenauigkeit beträgt 3.
{INTERVAL '3261' DAY(4)} Gibt ein Intervall von 3261 Tagen an. Die Intervallführungsgenauigkeit beträgt 4.
{INTERVAL '163' HOUR(3)} Gibt ein Intervall von 163 Tagen an. Die Intervallführungsgenauigkeit beträgt 3.
{INTERVAL '163' MINUTE(3)} Gibt ein Intervall von 163 Minuten an. Die Intervallführungsgenauigkeit beträgt 3.
{INTERVAL '223,16' SECOND(3,2)} Gibt ein Intervall von 223,16 Sekunden an. Die Intervallführungsgenauigkeit beträgt 3, und die Sekundengenauigkeit beträgt 2.
{INTERVAL '163-11' YEAR(3) TO MONTH} Gibt ein Intervall von 163 Jahren und 11 Monaten an. Die Intervallführungsgenauigkeit beträgt 3.
{INTERVAL '163 12' DAY(3) TO HOUR} Gibt ein Intervall von 163 Tagen und 12 Stunden an. Die Intervallführungsgenauigkeit beträgt 3.
{INTERVAL '163 12:39' DAY(3) TO MINUTE} Gibt ein Intervall von 163 Tagen, 12 Stunden und 39 Minuten an. Die Intervallführungsgenauigkeit beträgt 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 Intervallführungsgenauigkeit beträgt 3, und die Sekundengenauigkeit beträgt 3.
{INTERVAL '163:39' HOUR(3) TO MINUTE} Gibt ein Intervall von 163 Stunden und 39 Minuten an. Die Intervallführungsgenauigkeit beträgt 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 Intervallführungsgenauigkeit beträgt 3, und die Sekundengenauigkeit beträgt 4.
{INTERVAL '163:59.163' MINUTE(3) TO SECOND(5)} Gibt ein Intervall von 163 Minuten und 59,163 Sekunden an. Die Intervallführungsgenauigkeit beträgt 3, und die Sekundengenauigkeit beträgt 5.
{INTERVAL -'16 23:39:56.23' DAY TO SECOND} Gibt ein Intervall von minus 16 Tagen, 23 Stunden, 39 Minuten und 56,23 Sekunden an. Die implizierte führende Genauigkeit beträgt 2, und die implizierte Sekundengenauigkeit beträgt 6.

Die folgende Tabelle enthält Beispiele für ungültige Intervallliterale:

Literale Escapeklausel Grund, warum ungültig
{INTERVAL '163' HOUR(2)} Die Intervallführungsgenauigkeit beträgt 2, aber der Wert des führenden Felds ist 163.
{INTERVAL '223.16' SECOND(2,2)}

{INTERVAL '223.16' SECOND(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' YEAR}
Da die führende Genauigkeit nicht angegeben ist, ist sie standardmäßig auf 2 festgelegt, was zu klein ist, um das angegebene Literal zu halten.
{INTERVAL '22.1234567' SECOND} Die Sekundengenauigkeit ist nicht angegeben, daher ist sie standardmäßig auf 6 festgelegt. Das Literal hat sieben Ziffern nach dem Dezimaltrennzeichen.
{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)}
Das nachgestellte Feld folgt nicht den Regeln des gregorianischen Kalenders.