我遇到的情况是,两个人可能在两台不同的计算机上按相同的顺序工作(存储在MS数据库中)。为了防止数据丢失,在这样的情况下,一个人将首先保存他的订单副本,然后第二个将保存他的副本并覆盖第一个,我在保存之前添加了一个针对lastSaved字段(datetime)的检查。
代码大致如下所示:
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返回false,则本地副本将使其lastSaved更新到当前时间,然后持久化到数据库。lastSaved在本地副本和DB中的值现在应该是相同的。但是,如果orderIsChangedByOtherUser再次运行,它有时会返回true,即使没有其他用户对DB进行更改。
在Visual中调试时,databaseOrder.LastSaved和localOrderCopy.LastSaved的值似乎是相同的,但仔细看时,它们有时相差几毫秒。
我发现这篇文章在SQL中对datetime的毫秒精度做了一个简短的说明:
另一个问题是Server存储日期时间的精度为3.33毫秒(0毫秒)。00333秒)。
对于这个问题,我能想到的解决方案是比较这两个日期时间,如果它们的差值小于10毫秒,则将它们视为相等。
那么,我对您的问题是:是否有更好/更安全的方法来比较MS中的两个日期时间值,看看它们是否完全相同?
发布于 2020-08-18 19:32:53
检查SQL 2014的兼容版本- SQL 2016中的更改将实体框架中的DateTime转换为DateTime2(7)。
见MSN。
尝试使用此SQL对YourTable和YourDateTime列进行测试:
select top 100 <YourDateTimeColumn> date1,
cast(<YourDateTimeColumn> as datetime2(3)) date2,
cast(<YourDateTimeColumn> as datetime2(7)) date3,
case when <YourDateTimeColumn> <> cast(<YourDateTimeColumn> as datetime2(3))
then 'unequal' else 'equal' end as datesareequal
from <YourTableName>https://stackoverflow.com/questions/2620627
复制相似问题