Tengo una situación en la que dos personas pueden trabajar en el mismo orden (almacenado en una base de datos MS SQL) desde dos computadoras diferentes. Para evitar la pérdida de datos en el caso de que uno guarde primero su copia del pedido, y luego un poco más tarde el segundo guardará su copia y sobrescribirá el primero, he agregado un cheque en el campo lastSaved (datetime) antes ahorro.MS SQL problema de precisión de fecha y hora
El código es más o menos así:
private bool orderIsChangedByOtherUser(Order localOrderCopy)
{
// Look up fresh version of the order from the DB
Order databaseOrder = orderService.GetByOrderId(localOrderCopy.Id);
if (databaseOrder != null &&
databaseOrder.LastSaved > localOrderCopy.LastSaved)
{
return true;
}
else
{
return false;
}
}
Esto funciona para la mayoría de las veces, pero he encontrado un pequeño fallo.
Si orderIsChangedByOtherUser vuelve falsa, la copia local tendrá su lastSaved actualizado a la hora actual y luego ser persistido a la base de datos. El valor de lastSaved en la copia local y la base de datos ahora debería ser la misma. Sin embargo, si orderIsChangedByOtherUser se ejecuta nuevamente, a veces devuelve true aunque ningún otro usuario haya realizado cambios en la base de datos.
Al depurar en Visual Studio, databaseOrder.LastSaved y localOrderCopy.LastSaved parecen tener el mismo valor, pero cuando se mira más de cerca que a veces difieren en unos pocos milisegundos.
me encontré con un this article corto plazo sobre la precisión de milisegundos para la fecha y hora en SQL:
Otro problema es que SQL Server tiendas DATETIME con una precisión de milisegundos (3,33 0. 00333 segundos).
La solución que se me ocurrió para este problema es comparar las dos fechas y considerarlas iguales si difieren en menos de, por ejemplo, 10 milisegundos.
Mi pregunta es: ¿hay alguna forma mejor/más segura de comparar dos valores de fecha y hora en MS SQL para ver si son exactamente lo mismo que?
Solo para especificar: No tengo la opción de cambiar el tipo del campo * lastSaved *, así que tendré que mantenerme actualizado con datetime. – Nailuj