Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » SQL 方言和兼容性 » SQL 方言 » 为实现 Transact-SQL 兼容性配置数据库

 

特殊的 Transact-SQL 时间戳列和数据类型

SQL Anywhere 支持 Transact-SQL 的特殊时间戳列。时间戳列与 tsequal 系统函数一起检查行是否已更新。

时间戳的两种含义

SQL Anywhere 具有 TIMESTAMP 数据类型,它保存精确的日期和时间信息。它不同于特殊的 Transact-SQL TIMESTAMP 列和数据类型。

在 SQL Anywhere 中创建 Transact-SQL 时间戳列

要创建 Transact-SQL 时间戳列,请创建一个 (SQL Anywhere) 数据类型为 TIMESTAMP 且具有缺省时间戳设置的列。虽然名称 timestamp 比较常用,但该列可以具有任何名称。

例如,以下 CREATE TABLE 语句包含一个 Transact-SQL 时间戳列:

CREATE TABLE tablename (
   column_1 INTEGER,
   column_2 TIMESTAMP DEFAULT TIMESTAMP
);

以下 ALTER TABLE 语句将一个 Transact-SQL 时间戳列添加到 SalesOrders 表中:

ALTER TABLE SalesOrders
ADD timestamp TIMESTAMP DEFAULT TIMESTAMP;

在 Adaptive Server Enterprise 中,名称为 timestamp 且未指定数据类型的列会自动接收 TIMESTAMP 数据类型。在 SQL Anywhere 中,您必须自己显式指定数据类型。

时间戳列的数据类型

Adaptive Server Enterprise 将时间戳列当作允许 NULL 的 VARBINARY(8) 域,而 SQL Anywhere 将时间戳列当作 TIMESTAMP 数据类型,它包括日期和时间(秒的小数部分占六个小数位)。

在为随后的更新从表中读取时,读取时间戳值的变量应该与列说明相对应。

在 Interactive SQL 中,您可能需要设置 timestamp_format 选项以查看行值的差异。以下语句将 timestamp_format 选项设置为显示秒的小数部分的所有六位数字:

SET OPTION timestamp_format='YYYY-MM-DD HH:NN:SS.SSSSSS';

如果所有六位都未显示,则某些时间戳列值可能看起来相同,但实际上却不同。

将 tsequal 用于更新

利用 tsequal 系统函数,您可以确定时间戳列是否已得到更新。

例如,某一应用程序可能用 SELECT 将一个时间戳列添加到变量中。当某一选定行的 UPDATE 被提交时,它可能会使用 tsequal 函数检查该行是否已被修改。tsequal 函数将比较表中的时间戳值和在 SELECT 中获取的时间戳值。时间戳相同意味着没有变化。如果时间戳不同,则意味着该行在执行 SELECT 后出现了变化。

使用 tsequal 函数的典型 UPDATE 语句如下所示:

UPDATE publishers
SET City = 'Springfield'
WHERE pub_id = '0736'
AND TSEQUAL(timestamp, '2005/10/25 11:08:34.173226');

tsequal 函数的第一个参数是特殊时间戳列的名称,第二个参数是在 SELECT 语句中检索的时间戳。在嵌入式 SQL 中,第二个参数可能是一个主机变量,包含该列上进行最近的 FETCH 操作后的 TIMESTAMP 值。