gpt4 book ai didi

sql-server - SQL Server 中不需要的日期时间舍入

转载 作者:行者123 更新时间:2023-12-02 09:22:43 25 4
gpt4 key购买 nike

我遇到了一些看起来很奇怪的事情。当我将某些 DateTime 值保存到 datetime 列时,SQL Server 似乎对它们进行了不适当的舍入。我怀疑我错过了一些东西,但我无法发现它。我正在使用 .NET 4.0 针对 SQL Server 2008 运行此测试。以下应该说明这个问题:

我在 SQL Server 中创建了一个名为 Timestamps 的表。它有两列:

id - bigint、身份、PK
时间戳 - 日期时间

我还创建了一个简单的测试来执行以下操作:

  1. 获取当前时间,将值截断为毫秒精度
  2. 将截断的时间保存到时间戳
  3. 从数据库检索 datetime` 值并将其与原始(截断的)DateTime 对象进行比较。
public static void RoundTest()
{
DateTime preTruncation = DateTime.UtcNow;
DateTime truncated = preTruncation.TruncateToMilliseconds();

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["test"].ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(@"INSERT INTO Timestamps(timestamp)
VALUES(@savedTime);
SELECT SCOPE_IDENTITY() AS id");
cmd.Parameters.Add(new SqlParameter("savedTime", truncated));
cmd.Connection = conn;
var id = cmd.ExecuteScalar();

SqlCommand get = new SqlCommand(@"SELECT timestamp FROM Timestamps
WHERE id = @id");

get.Parameters.Add(new SqlParameter("id", id));
get.Connection = conn;
DateTime retrieved = (DateTime)get.ExecuteScalar();

if (retrieved != truncated)
{
Console.WriteLine("original: " + preTruncation.TimeOfDay);
Console.WriteLine("truncated: " + truncated.TimeOfDay);
Console.WriteLine("retrieved: " + retrieved.TimeOfDay);
Console.WriteLine();
}
}
}

虽然我希望截断的值等于从数据库返回的值,但情况并非总是如此。以下是一些示例输出:

original: 19:59:13.4049965
truncated: 19:59:13.4040000
retrieved: 19:59:13.4030000

original: 19:59:14.4989965
truncated: 19:59:14.4980000
retrieved: 19:59:14.4970000

original: 19:59:15.4749965
truncated: 19:59:15.4740000
retrieved: 19:59:15.4730000

original: 19:59:30.1549965
truncated: 19:59:30.1540000
retrieved: 19:59:30.1530000

TruncateToMilliseconds() 看起来像这样:

public static DateTime TruncateToMilliseconds(this DateTime t)
{
return new DateTime(t.Year, t.Month, t.Day, t.Hour, t.Minute, t.Second, t.Millisecond);
}

什么给了?这真的是不合适的舍入吗,还是我在这里做出了错误的假设?

最佳答案

日期时间仅精确到 3 毫秒。因此,它将四舍五入到最接近的 3ms 倍数。要克服这个问题,请查看 datetime2 。请注意,这仅适用于 SQL2008+

编辑:不只是 3 毫秒。它四舍五入为 0.000、0.003 或 0.007 秒的增量

关于sql-server - SQL Server 中不需要的日期时间舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com