timestamp类型的数据无法在数据库订阅同步模式下使用,如何解决,再送200分

csharplove 2011-03-19 04:25:40
我们这边需要同步合作方的数据,为简化同步逻辑,就让合作方在表里面加了一列timestamp数据类型,我们这边定时请求,传递上次的timestamp最大值,来获取变更的数据,维持双方数据的一致性,没预料到的是,他们那边使用了sql server的数据库订阅分发模式,不支持timestamp类型,这方面资料比较少,请数据库达人解答下,这种情况该如何处理,怎么能继续使用timestamp来做数据库同步,不知道我这里为撒限制只能奖励100分,如能解决问题,后续再送200分以示感谢。
...全文
176 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AcHerat 2011-03-19
  • 打赏
  • 举报
回复
时间戳去了吧!换成一个标识列!
dawugui 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 csharplove 的回复:]
楼上的朋友,timestamp是这个意思,但是怎么解决在数据库读写分离时,在订阅模式下不支持该数据类型列的问题呢
[/Quote]貌似无法解决,建议将字段转换类型.
快溜 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 csharplove 的回复:]
我们这边需要同步合作方的数据,为简化同步逻辑,就让合作方在表里面加了一列timestamp数据类型,我们这边定时请求,传递上次的timestamp最大值,来获取变更的数据,维持双方数据的一致性,没预料到的是,他们那边使用了sql server的数据库订阅分发模式,不支持timestamp类型,这方面资料比较少,请数据库达人解答下,这种情况该如何处理,怎么能继续使用timestamp来做数据库同步,……
[/Quote]
用标识列或者唯一id做对比,不要用时间戳。时间戳的最大值?你怎么找?
csharplove 2011-03-19
  • 打赏
  • 举报
回复
楼上的朋友,timestamp是这个意思,但是怎么解决在数据库读写分离时,在订阅模式下不支持该数据类型列的问题呢
--小F-- 2011-03-19
  • 打赏
  • 举报
回复
时间磋可以转换成 二进制数据流来做

--时间戳类型和bigint互相转化示例:byjinjazz

setnocounton
--申明3个时间戳
declare@timeFlag1bigint
declare@timeFlag2bigint
declare@timeFlag3bigint

--建立表,timestamp类型不需要字段名
createtabletest(timestamp,aint)

--插入1记录时间戳,@@dbts为数据库时间戳
insertintotestselectnull,1
set@timeFlag1=cast(@@dbtsasbigint)

--插入2记录时间戳
insertintotestselectnull,2
set@timeFlag2=cast(@@dbtsasbigint)

--更新3记录时间戳
updatetestseta=3wherea=2
set@timeFlag3=cast(@@dbtsasbigint)

--时间戳1的记录
select*fromtestwheretimestamp=cast(@timeFlag1asvarbinary(8))
--时间戳2的记录已经不存在了
select*fromtestwheretimestamp=cast(@timeFlag2asvarbinary(8))
--时间戳3的记录
select*fromtestwheretimestamp=cast(@timeFlag3asvarbinary(8))

--删除表
droptabletest
setnocountoff

/**//*--测试结果
timestamp     a
-----------------------------
0x000000000000B5531

timestamp     a
-----------------------------

timestamp     a
-----------------------------
0x000000000000B5553
*/
--小F-- 2011-03-19
  • 打赏
  • 举报
回复
 timestamp 通常用作给表行加版本戳的机制。 存储大小为 8 个字节。 timestamp 数据类型只是递增的数字,不保留日期或时间 

每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。 该计数器是数据库时间戳。 这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。 一个表只能有一个 timestamp 列。 每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。使用某一行中的 timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。 如果对行进行了更改,就会更新该时间戳值。 如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。

你如果是要返回数据库的当前时间戳值,可以使用 @@DBTS。
@@DBTS 返回当前数据库最后使用的时间戳值。 插入或更新包含 timestamp 列的行时,将产生一个新的时间戳值。
USE AdventureWorks;
GO
SELECT @@DBTS
-------------------------------------------------

这样是吗?
SELECT
CAST(GETDATE() AS timestamp) AS UsingCast,
CONVERT(timestamp, GETDATE(), 120) AS UsingConvert;
GO
这是取当前时间并转换成 timestamp

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧