间隔文本
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)} |
尾随字段不遵循公历规则。 |