2016-08-29 4 views
0

Wir haben ein sehr seltsames Problem bei der Speicherung von Datum in der Datenbank. GETUTCDATE Funktion wird in einer gespeicherten Prozedur verwendet, um einen Jobstartzeitstempel und Endzeitstempel zu aktualisieren. Die gespeicherte Prozedur wird vom serverseitigen .net-Code einmal zum Starten und erneut zum Aktualisieren des Endzeitstempels aufgerufen. Das Problem ist, Endzeitstempel 'ist früher als der Startzeitstempel. Ein ähnliches Problem wird in diesem SO question erwähnt, aber es half mir nicht, unser Problem zu lösen.SQL Server DATETIME Diskrepanz

Stored Procedure Code:

@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 

Von vb.net wir diese gespeicherte Prozedur aufrufen setzen Zeitstempel starten, Prozess einige Arbeit und stellen Ende Zeitstempel.

 ' 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 

Ergebnis aus Datenbank:

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

Jede Hilfe würde geschätzt.

Antwort

0

Sie möchten Ihre SP unteilbar machen - Transaktionen sollten funktionieren - der Server sollte die QUEUE-Tabelle in der Transaktion automatisch sperren - ODER Sie können sie vor der BEGIN TRANSACTION-Anweisung manuell sperren.

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 
0

Ich denke, dass Sie möglicherweise an der falschen Stelle suchen. Ich glaube nicht, dass dies ein Problem ist, wenn SQL Server GETUTCDATE() falsch berechnet, sondern ein Problem, bei dem sich der .NET-Code nicht so verhält, wie Sie es erwarten. Ohne all die Methoden und was nicht, kann ich nicht sagen, was vor sich geht, aber ich würde vorschlagen, SQL Profiler zu verwenden, um eine Ablaufverfolgung auf dem Prozess einzurichten, so dass Sie genau sehen können, wie und in welcher Reihenfolge die Aufrufe an den Prozess gemacht werden . Zumindest hilft Ihnen das, das Problem zu lösen, sei es in SQL Server oder in Ihrem .Net-Code.