间隔文本
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) } |
尾随字段不遵循公历规则。 |
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈