在SQL Server中插入以毫秒为单位的DateTime

本文关键字:为单位 DateTime SQL Server 插入 | 更新日期: 2023-09-27 18:00:20

我两周前开始了一个新的ASP.NET MVC项目。我正在使用micro ORM NPoco,我喜欢它!

在测试过程中,我在将DateTime属性保存到SQL Server 2014 Express中时遇到问题。

当我尝试插入DateTime00: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的问题。

在SQL Server中插入以毫秒为单位的DateTime

如果正确地指定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可能只是猜测数据类型错误,并使用与SQL Server中的DATETIME类型相对应的SqlDbType.DateTime,其准确度为3.33ms,因此该数据类型的.385将"四舍五入"为.387。

我不知道所有的细节,但请参阅本页上Otiel的回答。它似乎与你所看到的相匹配。

当存储在SQL Server 中时,我的DateTime中的毫秒数发生了更改

这是由于SQL日期时间类型的精度造成的。根据msdn:

Datetime values are rounded to increments of .000, .003, or .007 seconds