【问题标题】:SQL Server DATETIME discrepencySQL Server 日期时间差异
【发布时间】:2016-08-29 20:34:27
【问题描述】:

我们在数据库中存储日期时间时遇到了一个非常奇怪的问题。 GETUTCDATE 函数在存储过程中用于更新作业开始时间戳和结束时间戳。存储过程从服务器端 .net 代码调用一次以启动并再次更新结束时间戳。问题是“结束时间戳”早于开始时间戳。这个SO question 中提到了类似的问题,但它并没有帮助我解决我们的问题。

存储过程代码:

    @Id int,
    @Status int

if (@Status = 3) -- Processing
Begin
    Update QUEUE 
    Set STATUS = @Status,
        PROCESSING_START_TIMESTAMP = getutcdate()
    Where ID = @Id
End
Else if (@Status = 4) -- Completed
Begin
    Update QUEUE 
    Set STATUS = @Status,
        PROCESSING_END_TIMESTAMP = getutcdate()
    Where ID = @Id
End 
Else -- Failed
Begin
    Update QUEUE 
    Set STATUS = @Status
    Where ID = @Id
End

从 vb.net 我们调用这个存储过程来设置开始时间戳,处理一些工作并设置结束时间戳。

      ' Set Status to Processing
      ldbQueueMaster.SaveStatus(liQueueEntryId, 3)

      ' Call the Processor 
      Dim lbCompleted = lQueueProcessor.Processor(lQueueMaster, lsRootPath) 

      ' Set the Status based on Return from the Processor
      If (lbCompleted) Then
        ldbQueueMaster.SaveStatus(liQueueEntryId,4) 'Completed
      Else
        ldbQueueMaster.SaveStatus(liQueueEntryId, 5) 'Failed
      End If

来自数据库的结果:

ID             PROCESSING_START_TIMESTAMP       PROCESSING_END_TIMESTAMP
-------------- -------------------------------- ----------------------------
9533789        2016-08-03 18:34:22.190          2016-08-03 18:34:22.187

任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server vb.net tsql


    【解决方案1】:

    您想让您的 SP 原子化——事务应该可以工作——服务器应该在事务中自动锁定 QUEUE 表——或者你可以在 BEGIN TRANSACTION 语句之前手动锁定它。

    BEGIN TRANSACTION
    
    @Id int,
    @Status int
    
    If (@Status = 3) -- Processing
     Begin
      Update QUEUE Set
             STATUS = @Status,
             PROCESSING_START_TIMESTAMP = getutcdate()
       Where ID = @Id
     End
    Else if (@Status = 4) -- Completed
     Begin
       Update QUEUE Set
              STATUS = @Status,
              PROCESSING_END_TIMESTAMP = getutcdate()
        Where ID = @Id
     End 
    Else -- Failed
     Begin
       Update QUEUE Set
              STATUS = @Status
        Where ID = @Id
     End
    
    COMMIT TRANSACTION
    

    【讨论】:

      【解决方案2】:

      我想你可能找错地方了。我认为这不是 SQL Server 错误计算 GETUTCDATE() 的问题,而是 .Net 代码的行为方式与您期望的不同的问题。如果没有所有方法和诸如此类的东西,我无法说出发生了什么,但我建议使用 SQL Profiler 在 proc 上设置跟踪,以便您可以准确了解对 proc 的调用是如何以及以什么顺序进行的.至少,这将帮助您缩小问题所在,无论是在 SQL Server 还是在您的 .Net 代码中。

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 2018-05-09
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多