注意,SQL Server timestamp 数据类型与时间、日期没有关系。SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1。这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系。timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。下面是一个例子,你看看效果: --drop table xx--建表 create table xx(id int,t timestamp)--添加数据 insert into xx(id) select 1 select *, datalength(t) as '占用字节数', cast(t as datetime) '转化为日期型' from xx /* id t 占用字节数 转化为日期型 1 0x0000000000000FA2 8 1900-01-01 00:00:13.340 */
所以,时间戳有它的特殊用途,也就是保持唯一性,当某条数据被修改过,那么表中的时间戳字段的值,会自动修改:--drop table xx--建表 create table xx(id int,t timestamp)--添加数据 insert into xx(id) select 1 select *, datalength(t) as '占用字节数', cast(t as datetime) '转化为日期型' from xx /* id t 占用字节数 转化为日期型 1 0x0000000000000FA2 8 1900-01-01 00:00:13.340 */ --修改数据 update xx set id = 2 where id = 1 --我们并没有修改时间戳列的值,但是它的值会自动修改 --在上面我们看到他的值是:0x0000000000000FA2 select * from xx /* id t 2 0x0000000000000FA3 */
--drop table xx--建表
create table xx(id int,t timestamp)--添加数据
insert into xx(id) select 1
select *,
datalength(t) as '占用字节数',
cast(t as datetime) '转化为日期型'
from xx
/*
id t 占用字节数 转化为日期型
1 0x0000000000000FA2 8 1900-01-01 00:00:13.340
*/
create table xx(id int,t timestamp)--添加数据
insert into xx(id) select 1
select *,
datalength(t) as '占用字节数',
cast(t as datetime) '转化为日期型'
from xx
/*
id t 占用字节数 转化为日期型
1 0x0000000000000FA2 8 1900-01-01 00:00:13.340
*/
--修改数据
update xx
set id = 2
where id = 1
--我们并没有修改时间戳列的值,但是它的值会自动修改
--在上面我们看到他的值是:0x0000000000000FA2
select *
from xx
/*
id t
2 0x0000000000000FA3
*/