次の方法で共有


Interval のリテラル

ODBC では、すべてのドライバーで、SQL_CHARまたは SQL_VARCHAR データ型からすべての C 間隔データ型への変換がサポートされている必要があります。 ただし、基になるデータ ソースが間隔データ型をサポートしていない場合、ドライバーは、これらの変換をサポートするために、SQL_CHAR フィールドの値の正しい形式を認識する必要があります。 同様に、ODBC では、任意の ODBC C 型をSQL_CHARまたはSQL_VARCHARに変換できる必要があるため、ドライバーは文字フィールドに格納される間隔の形式を把握する必要があります。 このセクションでは、間隔リテラルの構文について説明します。ドライバー ライターは、C 間隔データ型への変換時または C 間隔データ型からの変換時にSQL_CHAR フィールドを検証するために使用する必要があります。

Note

間隔リテラルの完全な BNF 構文については、「付録 C: SQL 文法」の 「Interval Literal Syntax」 セクションを参照してください。

SQL ステートメントの一部として間隔リテラルを渡すには、間隔リテラルに対してエスケープ句構文が定義されます。 詳細については、「 日付、時刻、およびタイムスタンプ リテラル」を参照してください。

interval リテラルの形式は次のとおりです。

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

ここで、"INTERVAL" は文字リテラルが間隔であることを示します。 符号には、プラスまたはマイナスのいずれかを指定できます。これは間隔文字列の外側にあり、省略可能です。

間隔修飾子は、1 つの datetime フィールドにすることも、先頭フィールド TO < 末尾フィールドという形式<の 2 つの datetime フィールド>>で構成することもできます。

  • 間隔が 1 つのフィールドで構成されている場合、1 つのフィールドは、かっこ内の省略可能な先頭の有効桁数を伴う可能性がある 2 番目以外のフィールドにすることができます。 単一の datetime フィールドには、省略可能な先頭の有効桁数、オプションの小数部の秒の有効桁数 (かっこ内)、またはその両方を伴う可能性がある 2 番目のフィールドを指定することもできます。 先頭の有効桁数と秒の小数部の精度の両方が秒のフィールドに存在する場合は、コンマで区切られます。 seconds フィールドに秒の小数部の有効桁数がある場合は、先頭の精度も必要です。

  • 間隔が先頭と末尾のフィールドで構成されている場合、先頭のフィールドは 2 番目以外のフィールドであり、かっこ内の間隔の先頭フィールドの有効桁数が伴う可能性があります。 末尾のフィールドには、2 番目以外のフィールドまたは 2 番目のフィールドを指定できます。このフィールドには、かっこ内に秒の小数部の有効桁数を指定できます。

の間隔文字列は、単一引用符で囲まれています。 年月リテラルまたは日時リテラルのいずれかを指定できます。 の文字列の形式は、次の規則によって決まります。

  • 文字列には、間隔修飾子によって暗黙的に指定されるすべてのフィールドの 10 進値が<含まれます>。

  • 間隔の有効桁数に YEAR フィールドと MONTH フィールドが含まれている場合、これらのフィールドの値は負符号で区切ります。

  • 間隔の有効桁数に DAY フィールドと HOUR フィールドが含まれている場合、これらのフィールドの値はスペースで区切られます。

  • 間隔の有効桁数にフィールド HOUR と下位のフィールド (MINUTE と SECOND) が含まれている場合、これらのフィールドの値はコロンで区切られます。

  • 間隔の有効桁数に SECOND フィールドが含まれており、指定または暗黙的な秒の有効桁数が 0 以外の場合、2 番目の小数部の最初の桁の直前の文字はピリオドになります。

  • フィールドの長さは 2 桁以下です。ただし、次の点を除きます。

    • 先頭のフィールドの値は、前の有効桁数を表す間隔または暗黙的な間隔である限り指定できます。

    • SECOND フィールドの小数部は、指定された秒または暗黙的な秒の有効桁数である限り指定できます。

    • 末尾のフィールドは、グレゴリオ暦の通常の制約に従います。 ( 「グレゴリオ暦の制約」を参照してください)。

次の表に、間隔の ODBC エスケープ句に含まれる有効な間隔リテラルの例を示します。 エスケープ句の構文は次のとおりです。

Note

{INTERVAL sign interval-string interval-qualifier}

リテラルエスケープ句 指定された間隔
{INTERVAL '326' YEAR(4)} 326 年の間隔を指定します。 間隔の先頭の有効桁数は 4 です。
{INTERVAL '326' MONTH(3)} 326 か月の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '3261' DAY(4)} 3261 日の間隔を指定します。 間隔の先頭の有効桁数は 4 です。
{INTERVAL '163' HOUR(3)} 163 日の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '163' MINUTE(3)} 163 分の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '223.16' SECOND(3,2)} 223.16 秒の間隔を指定します。 間隔の先頭の有効桁数は 3 で、秒の有効桁数は 2 です。
{INTERVAL '163-11' YEAR(3) TO MONTH} 163 年と 11 か月の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '163 12' DAY(3) to Hour} 163 日と 12 時間の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '163 12:39' DAY(3) to MINUTE} 163 日、12 時間、39 分の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '163 12:39:59.163' DAY(3) to SECOND(3)} 163 日、12 時間、39 分、59.163 秒の間隔を指定します。 間隔の先頭の有効桁数は 3、秒の有効桁数は 3 です。
{INTERVAL '163:39' HOUR(3) to MINUTE} 163 時間 39 分の間隔を指定します。 間隔の先頭の有効桁数は 3 です。
{INTERVAL '163:39:59.163' HOUR(3) to SECOND(4)} 163 時間、39 分、59.163 秒の間隔を指定します。 間隔の先頭の有効桁数は 3 で、秒の有効桁数は 4 です。
{INTERVAL '163:59.163' MINUTE(3) to SECOND(5)} 163 分と 59.163 秒の間隔を指定します。 間隔の先頭の有効桁数は 3 で、秒の有効桁数は 5 です。
{INTERVAL -'16 23:39:56.23' DAY TO SECOND} -16 日、23 時間、39 分、56.23 秒の間隔を指定します。 暗黙的な先行精度は 2 で、暗黙的な秒の有効桁数は 6 です。

次の表に、無効な間隔リテラルの例を示します。

リテラルエスケープ句 無効な理由
{INTERVAL '163' HOUR(2)} 間隔の先頭の有効桁数は 2 ですが、先頭フィールドの値は 163 です。
{INTERVAL '223.16' SECOND(2,2)}

{INTERVAL '223.16' SECOND(3,1)}
最初の例では、先頭の精度が小さすぎます。2 番目の例では、秒の精度が小さすぎます。
{INTERVAL '223.16' SECOND}

{INTERVAL '223' YEAR}
先頭の有効桁数は指定されていないため、既定値は 2 で、指定されたリテラルを保持するには小さすぎます。
{INTERVAL '22.1234567' SECOND} 秒の有効桁数は指定されていないため、既定値は 6 です。 リテラルには、小数点の後に 7 桁の数字があります。
{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)}
末尾のフィールドは、グレゴリオ暦の規則に従っていません。