DateTime列设置为过去日期

时间:2017-08-25 13:51:47

标签: sql sql-server

我们有一个SQL Server数据库用于存储我们的交易数据。在每个表中,我们都有一个LastUpdatedOn列,可以使用GETDATE()函数进行填充。

我们看到的是,当我们对这些表进行批量更新操作时,在批量操作结束时,LastUpdatedOn列中的时间戳将是过去的日期。

例如:如果更新操作在上午10:00:00.000 AM开始,GETDATE()函数将选择该时间作为时间,LastUpdatedOn列将填充日期时间为10:00: 00.000 AM如果脚本需要30秒才能执行,那么在脚本完成执行的10:00:30.000 AM时,lastupdateon列将填充过去的日期。

请参阅下面的示例脚本:

SELECT TOP 100000 * 
INTO #tmp 
FROM dbo.Test

BEGIN TRAN

UPDATE L
SET l.lastupdateon = getdate()
FROM dbo.Test L
JOIN #tmp T ON T.entitykey = L.entitykey

COMMIT TRAN

我们遇到的问题是,我们有一个具有from和to日期的delta操作。此操作将返回在from和迄今之间更新的所有记录。在这种情况下,如果在上午10:00:15.000 AM调用增量操作,即使记录在上午10:00:00000更新,也不会提取作为脚本一部分更新的记录。这些记录永远不会被拉扯。

除了使事务可序列化之外,是否有解决此问题的方法?

此致

约翰

1 个答案:

答案 0 :(得分:0)

根本问题在于更新需要时间,因此在您告诉SQL Server向表中写入值以及何时提交该值以及其他人可见时,总会存在延迟。

您需要在delta操作中解决此问题。只有一个进程写入表中?如果是这样,新提交的行将始终具有LastUpdatedOn值,该值在表中的所有其他值之后。在这种情况下,delta操作应该跟踪上次获得的最大LastUpdatedOn值并查找大于该值的任何值。