日期、时间和时间戳文本

用于日期、时间和时间戳文本的转义语法为

{ -type ' value '}

其中“文本类型”是下表中列出的其中一个值。

文本类型 含义 格式
d 日期 yyyy-mm-dd
t 时间* hh:mm:ss[1]
ts Timestamp yyyy-mm-dd hh:mm:ss[.f...][1]

[1] 时间或时间戳间隔文本中小数点右侧的位数(包含秒组件)取决于秒精度,如 SQL_DESC_PRECISION 描述符字段中所示。 (有关详细信息,请参阅 SQLSetDescField。)

有关日期、时间和时间戳转义序列的详细信息,请参阅“附录 C:SQL 语法”中的日期、时间和时间戳转义序列

例如,以下两个 SQL 语句都会更新“订单”表中销售订单 1023 的打开日期。 第一个语句使用转义序列语法。 第二个语句对 DATE 列使用 Oracle Rdb 本机语法,并且不可互操作。

UPDATE Orders SET OpenDate={d '1995-01-15'} WHERE OrderID=1023  
UPDATE Orders SET OpenDate='15-Jan-1995' WHERE OrderID=1023  

日期、时间或时间戳文本的转义序列也可以放在绑定到日期、时间或时间戳参数的字符变量中。 例如,以下代码使用绑定到字符变量的日期参数来更新 Orders 表中销售订单 1023 的打开日期:

SQLCHAR      OpenDate[56]; // The size of a date literal is 55.  
SQLINTEGER   OpenDateLenOrInd = SQL_NTS;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_TYPE_DATE, 0, 0,  
                  OpenDate, sizeof(OpenDate), &OpenDateLenOrInd);  
  
// Place the date in the OpenDate variable. In addition to the escape  
// sequence shown, it would also be possible to use either of the  
// strings "{d '1995-01-15'}" and "15-Jan-1995", although the latter  
// is data source-specific.  
strcpy_s( (char*) OpenDate, _countof(OpenDate), "{d '1995-01-15'}");  
  
// Execute the statement.  
SQLExecDirect(hstmt, "UPDATE Orders SET OpenDate=? WHERE OrderID = 1023", SQL_NTS);  

不过,将参数直接绑定到日期结构通常更高效:

SQL_DATE_STRUCT   OpenDate;  
SQLINTEGER        OpenDateInd = 0;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 0, 0,  
                  &OpenDate, 0, &OpenDateLen);  
  
// Place the date in the dsOpenDate structure.  
OpenDate.year = 1995;  
OpenDate.month = 1;  
OpenDate.day = 15;  
  
// Execute the statement.  
SQLExecDirect(hstmt, "UPDATE Employee SET OpenDate=? WHERE OrderID = 1023", SQL_NTS);  

要确定驱动程序是否支持日期、时间或时间戳文本的 ODBC 转义序列,应用程序可调用 SQLGetTypeInfo。 如果数据源支持日期、时间或时间戳数据类型,则它也必须支持相应的转义序列。

数据源还可以支持 ANSI SQL-92 规范中定义的日期/时间文本,它们不同于日期、时间或时间戳文本的 ODBC 转义序列。 要确定数据源是否支持 ANSI 文本,应用程序会使用 SQL_ANSI_SQL_DATETIME_LITERALS 选项调用 SQLGetInfo

要确定驱动程序是否支持间隔文本的 ODBC 转义序列,应用程序可调用 SQLGetTypeInfo。 如果数据源支持日期/时间间隔数据类型,则它也必须支持相应的转义序列。

数据源还可以支持 ANSI SQL-92 规范中定义的日期/时间文本,它们不同于日期/时间间隔文本的 ODBC 转义序列。 要确定数据源是否支持 ANSI 文本,应用程序会使用 SQL_ANSI_SQL_DATETIME_LITERALS 选项调用 SQLGetInfo