适用于: SQL Server Azure SQL Database Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

本主题提供有关支持SQL Server日期和时间数据类型的 ODBC 类型的信息。

参数和结果集中的数据类型映射

除了 ODBC 数据类型 (SQL_TYPE_TIMESTAMP和SQL_TIMESTAMP) 之外,SQL Server Native Client ODBC 中添加了两个新的数据类型,以公开新的服务器类型:

  • SQL_SS_TIME2

  • SQL_SS_TIMESTAMPOFFSET

    下表显示完整的服务器类型映射。 注意,该表的某些单元格包含两个条目;在这些情况下,第一个是针对 ODBC 3.0 的值,第二个是针对 ODBC 2.0 的值。

    SQL Server 数据类型 SQL 数据类型 SQL_TYPE_TIMESTAMP

    SQL_TIMESTAMP SQL_TIMESTAMP_STRUCT

    TIMESTAMP_STRUCT SQL_C_TYPE_TIMESTAMP

    SQL_C_TIMESTAMP SQL_TYPE_TIMESTAMP

    SQL_TIMESTAMP SQL_TYPE_DATE

    SQL_DATE SQL_DATE_STRUCT

    DATE_STRUCT SQL_C_TYPE_DATE

    SQL_C_DATE SQL_TYPE_DATE

    SQL_DATE SQL_SS_TIME2 SQL_SS_TIME2_STRUCT SQL_C_SS_TIME2

    SQL_C_BINARY(ODBC 3.5 和更早版本) 0x4000 (sqlncli.h)

    SQL_BINARY (-2) SQL_SS_TIMESTAMPOFFSET SQL_SS_TIMESTAMPOFFSET_STRUCT SQL_C_SS_TIMESTAMPOFFSET

    SQL_C_BINARY(ODBC 3.5 和更早版本) 0x4001 (sqlncli.h)

    SQL_BINARY (-2)

    指定 SQL_C_BINARY 绑定时,将执行对齐检查,并对不正确的对齐报错。 该错误的 SQLSTATE 将是 IM016,并显示消息“结构对齐不正确”。

    数据格式:字符串和文字

    下表显示了SQL Server数据类型、ODBC 数据类型和 ODBC 字符串文本之间的映射。

    SQL Server 数据类型 ODBC 数据类型 客户端转换的字符串格式 datetime SQL_TYPE_TIMESTAMP

    SQL_TIMESTAMP 'yyyy-mm-dd hh:mm:ss[.999]'

    SQL Server 对于 Datetime 最多支持三位数字的秒小数部分。 Smalldatetime SQL_TYPE_TIMESTAMP

    SQL_TIMESTAMP 'yyyy-mm-dd hh:hh:ss'

    此数据类型精确到 1 分钟。 秒部分在输出中将为零,在输入中由服务器进行四舍五入。 SQL_TYPE_DATE

    SQL_DATE 'yyyy-mm-dd' SQL_SS_TIME2 'hh:mm:ss[.9999999]'

    可以选择指定最多达到七位数字的秒小数部分。 Datetime2 SQL_TYPE_TIMESTAMP

    SQL_TIMESTAMP 'yyyy-mm-dd hh:mm:ss[.9999999]'

    可以选择指定最多达到七位数字的秒小数部分。 DatetimeOFFSET SQL_SS_TIMESTAMPOFFSET 'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm'

    可以选择指定最多达到七位数字的秒小数部分。

    日期/时间文字的 ODBC 转义序列没有更改。

    结果中秒的小数部分始终使用点 (.),而不是冒号 (:)。

    返回到应用程序的字符串值始终与给定列的长度相同。 年、月、日、小时、分钟和秒部分将以前置零填充至其最大宽度,并且 datetime 值中的日期和时间之间有一个空格。 在 datetimeoffset 值的时间和时区偏移量之间也有一个空格。 时区偏移量前面始终有一个符号;如果偏移量是零,则该符号是加号 (+)。 如有必要,秒的小数部分将填充尾随零,直到达到列的定义精度。 对于 datetime 列,秒的小数部分有三位数。 对于 smalldatetime 列,秒部分没有小数位,并且秒将始终是零。

    空字符串不是有效的日期/时间文字,它不表示 NULL 值。 将空字符串转换到日期/时间值的尝试将导致 SQLState 22018 错误并显示消息“为转换指定的字符值无效。”。

    从字符串参数进行转换应当得到相同格式的字符串,不过,包含零小时和零分钟的时区的符号可以是加号或减号,并且允许秒的小数部分的尾随零最多可达 9 位数。 可以使用小数点结束时间部分,不带秒小数部分。

    当前,驱动程序允许标点字符前后有额外的空白,并且时间和时区偏移量之间的空格是可选的。 但是,这可能在未来版本中更改;应用程序不应当依赖于当前行为。

    数据格式:数据结构

    在下面描述的结构中,ODBC 指定了来自公历的以下约束:

  • “月”范围为从 1 到 12。

  • “日”字段范围为 1 到所在月包含的天数,必须与“年”和“月”字段一致,考虑闰年。

  • “小时”范围为从 0 到 23。

  • “分钟”范围为从 0 到 59。

  • 秒范围是 0 到 61.9(n)。 这允许最多两个闰秒以便与恒星时间保持同步。

    请注意,SQL Server不允许闰秒,因此大于 59 的第二个值将导致服务器错误。

    以下现有 ODBC 结构的实现已修改,以支持新的SQL Server日期和时间数据类型。 不过未更改定义。

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

    还有两个新结构:

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

    SQL_SS_TIME2_STRUCT

    此结构在 32 位和 64 位操作系统中都填充到 12 个字节。

    typedef struct tagSS_TIME2_STRUCT {  
       SQLUSMALLINT hour;  
       SQLUSMALLINT minute;  
       SQLUSMALLINT second;  
       SQLUINTEGER fraction;  
    } SQL_SS_TIME2_STRUCT;  
    

    SQL_SS_TIMESTAMPOFFSET_STRUCT

    typedef struct tagSS_TIMESTAMPOFFSET_STRUCT {  
       SQLSMALLINT year;  
       SQLUSMALLINT month;  
       SQLUSMALLINT day;  
       SQLUSMALLINT hour;  
       SQLUSMALLINT minute;  
       SQLUSMALLINT second;  
       SQLUINTEGER fraction;  
       SQLSMALLINT timezone_hour;  
       SQLSMALLINT timezone_minute;  
    } SQL_SS_TIMESTAMPOFFSET_STRUCT;  
    

    如果 timezone_hour 为负值, 则timezone_minute 必须为负或零。 如果 timezone_hour 为正数, 则timezone_minute 必须为正数或零。 如果 timezone_hour 为零, 则timezone_minute 可能具有 -59 到 +59 范围内的任何值。

    日期和时间改进 (ODBC)

  •