MSSQL数据库中表字段类型timestamp的问题

时间:2020-12-03 08:18:51
1.timestamp类型的字段的具体含义是什么?
2.数据窗口中怎么使用它?

18 个解决方案

#1


timestamp
timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。

注释
Transact-SQL timestamp 数据类型与在 SQL-92 标准中定义的 timestamp 数据类型不同。SQL-92 timestamp 数据类型等价于 Transact-SQL datetime 数据类型。 

Microsoft? SQL Server? 将来的版本可能会修改 Transact-SQL timestamp 数据类型的行为,使它与在标准中定义的行为一致。到那时,当前的 timestamp 数据类型将用 rowversion 数据类型替换。

Microsoft? SQL Server? 2000 引入了 timestamp 数据类型的 rowversion 同义词。在 DDL 语句中尽可能使用 rowversion 而不使用 timestamp。rowversion 受数据类型同义词行为的制约。有关更多信息,请参见数据类型同义词。

在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型提供列名:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp)

如果没有提供列名,SQL Server 将生成 timestamp 的列名。rowversion 数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。

一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。

不可为空的 timestamp 列在语义上等价于 binary(8) 列。可为空的 timestamp 列在语义上等价于 varbinary(8) 列。

在数据窗口中使用跟datetime类型没有区别。

#2


kuangtb(筐筐):谢谢,可数据窗口的数据源中根本不能加入该字段:
SELECT column has unsupported data type.

#3


在"搜索"中输入条件查找,多的是...

#4


查了,没有满意的结果。

PB中该怎么把它取出来转换为时间呢?

#5


这样的一些数据究竟是什么含义:
0x0000000000000458
0x0000000000000459
0x000000000000045A
0x000000000000045C
...
???
是不是每更新一条记录,这条记录的时间戳字段就会自动变为整个表中的最大值?

#6


UP

#7


我来说一下吧!看能否帮上忙:
1.它是标识数据类型
  从字面上看,它是“时间戳”的意思,但timestamp数据类型与日期、时间并没有任何关系。它的数值格式类似于0x000000000000025A。一个表中只能有一个timestamp类型的字段。一旦将表中的一个字段指定为timestamp数据类型,该字段的值就不用设置了,它会随表中记录内容的修改而自动更新,而且在整个数据库范围都是惟一的。

2.在pb的dw中用时:只在当它作为主键时,加入它作为更新用的主键(可不用显示出来)保存提交时它由数据库自动赋值。

呵呵!!不知说明白没有。:-)

#8


现在说说我的目的吧:加时间戳字段主要是想知道用户最近都改动了(新增、修改)哪些记录,以便作其它操作,但不能将其加入到数据窗口中,有其它方法吗?

#9


我认为可以在系统代码里做嘛!
1.如果只是一张表,做个触发器,改动datetime字段为改动时间就行了。

2.如果是多个表,就在代码上加入一个通用函数和一个日志表,通过调用该函数了增加日志表记录。

#10


liuyxit(都随风!都随风!心随你动!):你那样当然可以实现,但要是能利用timestamp岂不是可以减少很多代码?

#11


我觉得还是尽量用一些比较通用的数据类型较好,我们现在已经连DATE类型都不用了,改成STRING了,就因为不同DBMS之间的DATE类型不兼容,无法移植程序,如果你的程序没有移值的可能性那另当别论

#12


继续吧

#13


用时间戳你怎么去看他是最近改动的?
我觉得还是加一个表专门记录最近改动的数据为好!
或是给每一个表的加一日期时间字段!记录更新时间

#14


xjbs(大鱼) (  ):那样做工作量太大。最近改动的时间戳值应该大些吧?

#15


建议不要使用~
timestamp本来就是DBMS提供的,一般拒绝用户操作~
另外PB与DBMS的接口驱动一般都不会支持该数据类型的~

#16


这是dbms提供的行时间戳,不建议使用。
有一个场合可以使用:
若需要生成一个流水号,可以建立一个流水号表并加入timestamp类型列,通过存储过程得到最新数字(update前比较是否是select时的值,并循环取值),这样可以在sql server中建立oracle的sequence方法,但与事务相关,还是没有oracle中的sequence方便,搞不懂为什么ms sql server不支持sequence?sybase都支持的。

当然,ms sql server也有自己的主键机制,譬如设置default为 newid()函数并转换就可以得到32位字串的全球唯一编码,而且可以事先通过存储过程得到,不过就是太长了而已。

#17


作个标记

#18


做个标记

#1


timestamp
timestamp 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。

注释
Transact-SQL timestamp 数据类型与在 SQL-92 标准中定义的 timestamp 数据类型不同。SQL-92 timestamp 数据类型等价于 Transact-SQL datetime 数据类型。 

Microsoft? SQL Server? 将来的版本可能会修改 Transact-SQL timestamp 数据类型的行为,使它与在标准中定义的行为一致。到那时,当前的 timestamp 数据类型将用 rowversion 数据类型替换。

Microsoft? SQL Server? 2000 引入了 timestamp 数据类型的 rowversion 同义词。在 DDL 语句中尽可能使用 rowversion 而不使用 timestamp。rowversion 受数据类型同义词行为的制约。有关更多信息,请参见数据类型同义词。

在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型提供列名:

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp)

如果没有提供列名,SQL Server 将生成 timestamp 的列名。rowversion 数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。

一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。

不可为空的 timestamp 列在语义上等价于 binary(8) 列。可为空的 timestamp 列在语义上等价于 varbinary(8) 列。

在数据窗口中使用跟datetime类型没有区别。

#2


kuangtb(筐筐):谢谢,可数据窗口的数据源中根本不能加入该字段:
SELECT column has unsupported data type.

#3


在"搜索"中输入条件查找,多的是...

#4


查了,没有满意的结果。

PB中该怎么把它取出来转换为时间呢?

#5


这样的一些数据究竟是什么含义:
0x0000000000000458
0x0000000000000459
0x000000000000045A
0x000000000000045C
...
???
是不是每更新一条记录,这条记录的时间戳字段就会自动变为整个表中的最大值?

#6


UP

#7


我来说一下吧!看能否帮上忙:
1.它是标识数据类型
  从字面上看,它是“时间戳”的意思,但timestamp数据类型与日期、时间并没有任何关系。它的数值格式类似于0x000000000000025A。一个表中只能有一个timestamp类型的字段。一旦将表中的一个字段指定为timestamp数据类型,该字段的值就不用设置了,它会随表中记录内容的修改而自动更新,而且在整个数据库范围都是惟一的。

2.在pb的dw中用时:只在当它作为主键时,加入它作为更新用的主键(可不用显示出来)保存提交时它由数据库自动赋值。

呵呵!!不知说明白没有。:-)

#8


现在说说我的目的吧:加时间戳字段主要是想知道用户最近都改动了(新增、修改)哪些记录,以便作其它操作,但不能将其加入到数据窗口中,有其它方法吗?

#9


我认为可以在系统代码里做嘛!
1.如果只是一张表,做个触发器,改动datetime字段为改动时间就行了。

2.如果是多个表,就在代码上加入一个通用函数和一个日志表,通过调用该函数了增加日志表记录。

#10


liuyxit(都随风!都随风!心随你动!):你那样当然可以实现,但要是能利用timestamp岂不是可以减少很多代码?

#11


我觉得还是尽量用一些比较通用的数据类型较好,我们现在已经连DATE类型都不用了,改成STRING了,就因为不同DBMS之间的DATE类型不兼容,无法移植程序,如果你的程序没有移值的可能性那另当别论

#12


继续吧

#13


用时间戳你怎么去看他是最近改动的?
我觉得还是加一个表专门记录最近改动的数据为好!
或是给每一个表的加一日期时间字段!记录更新时间

#14


xjbs(大鱼) (  ):那样做工作量太大。最近改动的时间戳值应该大些吧?

#15


建议不要使用~
timestamp本来就是DBMS提供的,一般拒绝用户操作~
另外PB与DBMS的接口驱动一般都不会支持该数据类型的~

#16


这是dbms提供的行时间戳,不建议使用。
有一个场合可以使用:
若需要生成一个流水号,可以建立一个流水号表并加入timestamp类型列,通过存储过程得到最新数字(update前比较是否是select时的值,并循环取值),这样可以在sql server中建立oracle的sequence方法,但与事务相关,还是没有oracle中的sequence方便,搞不懂为什么ms sql server不支持sequence?sybase都支持的。

当然,ms sql server也有自己的主键机制,譬如设置default为 newid()函数并转换就可以得到32位字串的全球唯一编码,而且可以事先通过存储过程得到,不过就是太长了而已。

#17


作个标记

#18


做个标记