У меня есть ситуация, когда два человека могут работать в одном и том же порядке (хранятся в базе данных MS SQL) с двух разных компьютеров. Чтобы предотвратить потерю данных в случае, когда сначала нужно сохранить свою копию заказа, а затем немного позже, второй сохранит его копию и перезапишет первое, я добавил чек против поля lastSaved (дата и время) до экономии.Проблема точности datetime MS SQL
Код выглядит примерно так:
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;
}
}
Это работает большую часть времени, но я нашел одну маленькую ошибку.
Если orderIsChangedByOtherUser возвращает ложной, локальная копия будет иметь свой LastSaved обновлен до текущего времени и затем сохраняется в базе данных. Значение lastSaved в локальной копии и БД должно быть таким же. Однако, если orderIsChangedByOtherUser запускается снова, он иногда возвращает true, хотя ни один другой пользователь не внес изменений в БД.
При отладке в Visual Studio, databaseOrder.LastSaved и localOrderCopy.LastSaved по всей видимости, имеют то же значение, но при взгляде ближе они несколько раз отличаются от нескольких миллисекунд.
Я нашел this article с коротким уведомлением о точностью до миллисекунды для DateTime в SQL:
Другая проблема заключается в том, что SQL Server хранит DATETIME с точностью 3,33 миллисекунды (0. 00333 секунд).
Решение, о котором я мог думать по этой проблеме, состоит в том, чтобы сравнить два времени и считать их равными, если они отличаются менее чем на 10 миллисекунд.
Мой вопрос к вам: есть ли лучшие/более безопасные способы сравнить два значения datetime в MS SQL, чтобы узнать, являются ли они точно тем же?
Просто для указания: у меня нет возможности изменить тип поля * lastSaved *, поэтому мне придется придерживаться даты и времени. – Nailuj