间隔文本

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 <尾随字段>

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

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

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

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

  • 如果间隔精度包括字段 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) 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)}
尾随字段不遵循公历规则。