间隔文本

ODBC 要求所有驱动程序都支持将SQL_CHAR或SQL_VARCHAR数据类型转换为所有 C 间隔数据类型。 但是,如果基础数据源不支持间隔数据类型,驱动程序需要知道SQL_CHAR字段中值的正确格式才能支持这些转换。 同样,ODBC 要求任何 ODBC C 类型都可以转换为SQL_CHAR或SQL_VARCHAR,因此驱动程序需要知道字符字段中存储的时间间隔的格式。 本部分介绍间隔文本的语法,驱动程序编写器需要在转换到 C 间隔数据类型或从 C 间隔数据类型期间验证SQL_CHAR字段。

注意

间隔文本的完整 BNF 语法显示在附录 C:SQL语法的“间隔文本语法”部分中。

若要将间隔文本作为SQL语句的一部分传递,为间隔文本定义转义子句语法。 有关详细信息,请参阅 日期、时间和时间戳文本

间隔文本采用以下形式:

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

其中“INTERVAL”指示字符文本为间隔。 符号可以是加号或减号;它不在间隔字符串之外,是可选的。

间隔限定符可以是单个日期/时间字段,也可以由两个日期/时间字段组成,格式为: <前导字段> TO <尾随字段>。

  • 当间隔由单个字段组成时,单个字段可以是一个非第二个字段,该字段可能附带括号中的可选前导精度。 单个日期/时间字段也可以是另一个字段,可能附带可选的前导精度、括号中的可选小数秒精度或两者。 如果前导精度和小数秒精度都存在秒字段,则用逗号分隔。 如果秒字段具有小数秒精度,则还必须具有前导精度。

  • 当间隔由前导字段和尾随字段组成时,前导字段是一个非第二个字段,可能伴随着圆括号中的间隔前导字段精度。 尾随字段可以是非第二个字段,也可以是另一个字段,该字段的括号内可能带有间隔小数秒精度。

值中的间隔字符串用单引号括起来。 它可以是年月文本或日时间文本。 值 中的字符串 的格式由以下规则决定:

  • 该字符串包含intervalqualifier> 隐含<的每个字段的十进制值。

  • 如果间隔精度包括字段 YEAR 和 MONTH,则这些字段的值用减号分隔。

  • 如果间隔精度包括字段 DAY 和 HOUR,则这些字段的值由空格分隔。

  • 如果间隔精度包括字段 HOUR 和下序字段 (MINUTE 和 SECOND) ,则这些字段的值由冒号分隔。

  • 如果间隔精度包括 SECOND 字段,并且表示或隐含的秒精度为非零,则紧邻第二部分小数部分的第一位数前的字符是句点。

  • 字段长度不能超过两位数,但以下情况除外:

    • 前导字段的值可以长于表示或隐式间隔前导精度。

    • SECOND 字段的小数部分可以长于表示或隐含的秒精度。

    • 尾随字段遵循公历的常规约束。 (查看 公历的约束。)

下表列出了 ODBC 转义子句中包含的有效间隔文本示例(对于间隔)。 转义子句的语法如下所示:

注意

{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。 文本在小数点后有 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) }
尾随字段不遵循公历规则。