SQL Server的CURRENT_TIMESTAMP与C#的DateTime.Now的区别

3
sql server获取当前时间的方式和c#编译器获取它的方式可能不同吗?
我在sql server表中有一个触发器,在每次更新时,updateDatetime列将被更新为当前日期时间。
我使用current_timestamp获取当前日期时间。
我还有一个连接到这个数据库并使用本机sql更新表的c#代码,更新后将创建触发器。
问题是我正在运行一个NUnit测试,在测试中我进行了一次更新,然后检索已更改的行。如果我比较更新后的DateTime与测试开始时的当前时间,它们是不同的。 我使用DateTime.UtcNow执行此操作。
差异只有几毫秒,但有趣的是,测试开始时的时间比触发器的时间晚!这没有意义。
以下是一些代码,以说明我的意思。
                DateTime dateTimeBefore = DateTime.UtcNow;

                // Act
                bookDao.Update(book);

                // Assert
                alteredBook = bookDao.GetByKey(bookingDao);


                Console.WriteLine("dateTimeBefore: {0} - {1}", dateTimeBefore, dateTimeBefore.Millisecond);
                Console.WriteLine("UpdateDateTime: {0} - {1}", alteredBook.UpdatedDateTime, alteredBook.UpdatedDateTime.Millisecond);

                Assert.IsTrue(alteredBook.UpdatedDateTime >= dateTimeBefore);

这是触发器的代码: update Book set UpdatedDatetime = current_timestamp from inserted where inserted.Id = Booking.Booking.Id 它与IT技术有关,涉及数据库更新操作。

我不知道在你的例子中是否会这样,但编译器实际上可能会改变命令的顺序(例如,它可以将“DateTime dateTimeBefore = DateTime.UtcNow;”移到“alteredBook = bookDao.GetByKey(bookingDao);”的下面)。 - C.Evenhuis
SQL Server 实例是否在同一台计算机上运行,即 SQL Server 实例所在的计算机? - objectbox
我以前也发现过类似的差异,即使使用 SYSDATETIMEGETDATE - Martin Smith
1个回答

1

current_time是从运行SQL Server实例的计算机操作系统中派生出来的,因此datetime.now也是如此。如果您的单元测试在nunit所在的计算机上运行,而您的SQL Server实例在另一台计算机上运行,则比较这两个值的结果取决于每台计算机的本地时间设置。

此外,在同一台计算机上,sql server datetime类型的current_timestamp和datetime.now这两个值甚至具有不同的精度 - 从DateTime转换为SqlDateTime不准确


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接