将带毫秒的 DateTime 插入 SQL 服务器
Insert DateTime with milliseconds into SQL Server
两周前我开始了一个新的 ASP.NET MVC 项目。我正在使用微型 ORM NPoco,我喜欢它!
在测试过程中,我 运行 将 DateTime
属性保存到 SQL Server 2014 Express 中时遇到问题。
当我尝试插入 DateTime
值 00:03:28.385
时,它在数据库中保存为 00:03:28.387
。数据库列类型为 time(7)
。我试过 datetime2(7)
结果总是一样 -> 00:03:28.387
然后我尝试了普通的 System.Data.SqlClient
:
var insert = "insert into Foo(time) values (@time)";
var conn = new SqlConnection(@"conntionString");
conn.Open();
var cmd = new SqlCommand(insertString.ToString(), _conn);
cmd.Parameters.AddWithValue("@Time", DateTime.ParseExact("00:03:28.385", "HH:mm:ss.fff", CultureInfo.InvariantCulture));
cmd.ExecuteNonQuery();
结果是一样的:00:03:28.387
将时间作为字符串插入时会起作用。
insert into Foo(time) values ('00:03:28.385')
所以这不是 NPoco 的问题。
我不知道所有细节,但请参阅 Otiel 在 this page 上的回答。它似乎与您所看到的相符。
Milliseconds in my DateTime changes when stored in SQL Server
This is due to the precision of the SQL datetime type. According to
msdn:
Datetime values are rounded to increments of .000, .003, or .007 seconds
如果您正确地指定了您的SqlCommand
的参数,它工作得很好:
string connStr = "server=.;database=Test;Integrated security=SSPI;";
string insertQry = "INSERT INTO dbo.Foo(time) VALUES(@Time);";
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand insertCmd = new SqlCommand(insertQry, conn))
{
// use proper Parameters syntax - specify SqlDbType!
insertCmd.Parameters.Add("@time", SqlDbType.Time).Value = TimeSpan.Parse("00:03:28.385");
conn.Open();
insertCmd.ExecuteNonQuery();
conn.Close();
}
我认为 .AddParameterWithValue
可能只是 猜测 数据类型错误并使用 SqlDbType.DateTime
对应于 [=24] 中的 DATETIME
类型=] 服务器 - 确实具有 3.33 毫秒的精度 - 因此对于该数据类型,.385 将是 "rounded up" 到 .387。
两周前我开始了一个新的 ASP.NET MVC 项目。我正在使用微型 ORM NPoco,我喜欢它!
在测试过程中,我 运行 将 DateTime
属性保存到 SQL Server 2014 Express 中时遇到问题。
当我尝试插入 DateTime
值 00:03:28.385
时,它在数据库中保存为 00:03:28.387
。数据库列类型为 time(7)
。我试过 datetime2(7)
结果总是一样 -> 00:03:28.387
然后我尝试了普通的 System.Data.SqlClient
:
var insert = "insert into Foo(time) values (@time)";
var conn = new SqlConnection(@"conntionString");
conn.Open();
var cmd = new SqlCommand(insertString.ToString(), _conn);
cmd.Parameters.AddWithValue("@Time", DateTime.ParseExact("00:03:28.385", "HH:mm:ss.fff", CultureInfo.InvariantCulture));
cmd.ExecuteNonQuery();
结果是一样的:00:03:28.387
将时间作为字符串插入时会起作用。
insert into Foo(time) values ('00:03:28.385')
所以这不是 NPoco 的问题。
我不知道所有细节,但请参阅 Otiel 在 this page 上的回答。它似乎与您所看到的相符。
Milliseconds in my DateTime changes when stored in SQL Server
This is due to the precision of the SQL datetime type. According to msdn:
Datetime values are rounded to increments of .000, .003, or .007 seconds
如果您正确地指定了您的SqlCommand
的参数,它工作得很好:
string connStr = "server=.;database=Test;Integrated security=SSPI;";
string insertQry = "INSERT INTO dbo.Foo(time) VALUES(@Time);";
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand insertCmd = new SqlCommand(insertQry, conn))
{
// use proper Parameters syntax - specify SqlDbType!
insertCmd.Parameters.Add("@time", SqlDbType.Time).Value = TimeSpan.Parse("00:03:28.385");
conn.Open();
insertCmd.ExecuteNonQuery();
conn.Close();
}
我认为 .AddParameterWithValue
可能只是 猜测 数据类型错误并使用 SqlDbType.DateTime
对应于 [=24] 中的 DATETIME
类型=] 服务器 - 确实具有 3.33 毫秒的精度 - 因此对于该数据类型,.385 将是 "rounded up" 到 .387。