当前位置: 首页 > 面试题库 >

MS SQL日期时间精度问题

白丁雨
2023-03-14
问题内容

我遇到这样的情况,两个人可能在两台不同的计算机上以相同的顺序工作(存储在MS
SQL数据库中)。为了防止数据丢失,在这种情况下,一个人先保存订单的副本,然后再稍等一会再保存他的副本并覆盖第一个副本,我在保存之前对
lastSaved 字段(日期时间)添加了一个检查。

该代码大致如下所示:

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 的值应该相同。但是,如果再次运行
orderIsChangedByOtherUser ,则即使没有其他用户对数据库进行更改,有时也会返回 true

在Visual Studio中进行调试时, databaseOrder.LastSavedlocalOrderCopy.LastSaved
似乎具有相同的值,但是当仔细观察时,它们有时相差几毫秒。

我发现这篇文章对SQL中日期时间的毫秒精度有一个简短的通知:

另一个问题是SQL Server以3.33毫秒(0. 00333秒)的精度存储DATETIME。

对于这个问题,我能想到的解决方案是比较两个日期时间,如果它们之间的差异小于10毫秒,则认为它们相等。

那么我想问的是:是否有更好/更安全的方法来比较MS SQL中的两个日期时间值,看它们是否 完全相同


问题答案:

我知道您说过您不能更改类型,但是如果这仅仅是为了保持兼容性并且您使用2008年,就可以将lastSaved字段更改为DATETIME2(与完全兼容DATETIME),并使用SYSDATETIME()两者都具有更高的精度。



 类似资料:
  • 问题内容: MSSQL 2005数据库具有排序规则“ German_Phonebook_BIN”(但这并不重要)。通过PDO和FreeTDS(使用Debian Squeeze下的PHP)完成与db的连接。当我尝试从表中选择日期时间值时,我得到如下结果: 2008年4月1日12:00:00:000 但我希望得到 2008-01-01 00:00:00 (关于时间00:00:00转换为12:00:00

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将

  • 我有一个变量,它包含以下值: 我目前正在使用以下代码将其格式化为字符串:.使用此代码,我得到以下值: 我需要这个更准确。我想要得到的精确值在以下精度范围内: 我在以下链接上做了一些研究:http://www.w3.org/TR/NOTE-datetime 以下是我的发现: 此配置文件没有指定可以使用多少位数来表示每秒的小数部分。允许分数秒的采用标准必须规定最小位数(大于或等于一的数字)和最大位数(

  • 介绍 日期时间包是Hutool的核心包之一,提供针对JDK中Date和Calendar对象的封装,封装对象如下: 日期时间工具 DateUtil 针对日期时间操作提供一系列静态方法 DateTime 提供类似于Joda-Time中日期时间对象的封装,继承自Date类,并提供更加丰富的对象方法。 FastDateFormat 提供线程安全的针对Date对象的格式化和日期字符串解析支持。此对象在实际使

  • 问题内容: 我有一个JDBC Date列,如果我使用getDate只能在 2009年10月2日* 得到’ date ‘部分,但是如果我使用getTimestamp我就可以得到完整的’ date ‘ 2009年10月2日13:56:78:890 。这正是我想要的。 __ *** 但是,getTimestamp返回的“日期”会“忽略” GMT值(假设为日期); 2009年10月2日13:56:78:8

  • 问题内容: Java 8中新的Date Time API的功能之一应该是纳秒级精度。但是当我像这样将当前日期时间打印到控制台时 我只看到毫秒精度:2015-11-02T12:33:26,746000000 + 0100 操作系统似乎确实支持纳秒精度。当我通过终端打印当前日期时间时 我看到2015-11-02T12:33:26,746134417 + 0100 如何在Java中获得纳秒精度?我在Ub