间隔文本

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

注意

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

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

间隔文本的形式如下:

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

其中,“INTERVAL”指示字符文本为间隔。 符号可以是正负;它超出了间隔字符串,并且是可选的。

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

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

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

中的间隔字符串用单引号引起来。 它可以是年月文本,也可以是日间文字。 中字符串的格式由以下规则确定:

  • 字符串包含间隔限定符>隐含的每个字段的<十进制值。

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

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

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

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

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

    • 前导字段的值可以与明示或隐式间隔前导精度一样长。

    • SECOND 字段的小数部分可以与明示或隐式秒精度一样长。

    • 尾随字段遵循公历的常见约束。 (请参阅 公历的约束)

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

注意

{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) 到 SECOND (4) } 指定 163 小时、39 分钟和 59.163 秒的间隔。 间隔前导精度为 3,秒精度为 4。
{INTERVAL '163:59.163' MINUTE (3) 到 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) 到 SECOND (4) }

{INTERVAL '163:591.163' MINUTE (3) TO SECOND (5) }
尾随字段不遵循公历规则。