間隔常值

ODBC 要求所有驅動程式都支援將SQL_CHAR或SQL_VARCHAR資料類型轉換成所有 C 間隔資料類型。 不過,如果基礎資料來源不支援間隔資料類型,驅動程式必須知道SQL_CHAR欄位中值的正確格式,才能支援這些轉換。 同樣地,ODBC 要求任何 ODBC C 類型都可以轉換成SQL_CHAR或SQL_VARCHAR,因此驅動程式必須知道字元欄位中儲存的間隔應該具有何種格式。 本節描述間隔常值語法,驅動程式寫入器必須在轉換至 C interval 資料類型或從 C 間隔資料類型期間,用來驗證SQL_CHAR欄位。

注意

間隔常值的完整 BNF 語法會顯示在附錄 C: SQL 文法中的間隔常值語法 一節 中。

若要將間隔常值當做 SQL 語句的一部分傳遞,則會針對間隔常值定義逸出子句語法。 如需詳細資訊,請參閱日期、時間和時間戳記常值

間隔常值的格式如下:

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

其中 「INTERVAL」 表示字元常值是間隔。 符號可以是加號或減號;它位於間隔字串之外,而且是選擇性的。

間隔限定詞可以是單一日期時間欄位,或由兩個日期時間欄位組成,格式為: < 前置欄位 > TO < 尾端欄位 >

  • 當間隔是由單一欄位所組成時,單一欄位可以是非第二個欄位,可能加上括弧中的選擇性前置精確度。 單一日期時間欄位也可以是第二個欄位,可能伴隨著選擇性前置精確度、括弧中的選擇性小數秒精確度,或兩者。 如果前置有效位數和小數秒有效位數都存在秒欄位,則會以逗號分隔。 如果秒欄位具有小數秒有效位數,它也必須具有前置有效位數。

  • 當間隔是由前置欄位和尾端欄位所組成時,前置欄位是非第二個欄位,可能會加上括弧中的間隔前置欄位有效位數。 尾端欄位可以是非秒欄位或第二個欄位,其可能加上括弧中的間隔小數秒精確度。

中的 間隔字串會以單引號括住。 它可以是年月常值或日時間常值。 值 中的 字串格式取決於下列規則:

  • 字串包含間隔 限定詞 > 所隱含之每個欄位的 < 十進位值。

  • 如果間隔有效位數包含 YEAR 和 MONTH 欄位,這些欄位的值會以減號分隔。

  • 如果間隔有效位數包含 DAY 和 HOUR 欄位,這些欄位的值會以空格分隔。

  • 如果間隔有效位數包含欄位 HOUR 和下階欄位 (MINUTE 和 SECOND),這些欄位的值會以冒號分隔。

  • 如果間隔有效位數包含 SECOND 欄位,且表示或隱含秒數有效位數為非零,則緊接在第二個小數部分第一位數之前的字元為句點。

  • 欄位長度不能超過兩位數,但下列除外:

    • 前置欄位的值只要是表示或隱含間隔前置精確度即可。

    • SECOND 欄位的小數部分只要表示或隱含秒數有效位數即可。

    • 尾端欄位會遵循西曆的一般條件約束。 (請參閱 西曆 的條件約束。

下表列出有效的間隔常值範例,如 ODBC 逸出子句中包含的間隔。 escape 子句的語法如下所示:

注意

{INTERVAL 符號 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)}
在第一個範例中,前置精確度太小,在第二個範例中,秒精確度太小。
{INTERVAL '223.16' SECOND}

{INTERVAL '223' YEAR}
由於前置精確度未指定,所以預設為 2,太小而無法保存指定的常值。
{INTERVAL '22.1234567' SECOND} 秒數精確度未指定,因此預設為 6。 常值在小數點後面有七位數。
{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)}
尾端欄位不會遵循西曆的規則。