C# 从SQL Server 2008 R2表中选择datetime列

C# 从SQL Server 2008 R2表中选择datetime列,c#,tsql,datetime,sql-server-2008-r2,C#,Tsql,Datetime,Sql Server 2008 R2,我在SQLServer2008R2数据库的表上有一个DateTime列。我的c前端正在该表中插入一行,其中包含datetime参数 DateTime T = DateTime.Now; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "cargridsnapshot"; cmd.Parameters.AddWithValue("@t", T); cmd.ExecuteNonQuery(); 表中行中的dateti

我在SQLServer2008R2数据库的表上有一个DateTime列。我的c前端正在该表中插入一行,其中包含datetime参数

DateTime T = DateTime.Now;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "cargridsnapshot";
cmd.Parameters.AddWithValue("@t", T);
cmd.ExecuteNonQuery();
表中行中的datetime列如下所示:

2013-09-04 16:21:23.450
但是


不返回任何结果。

SQL Server仅将时间存储到大约1/300秒,您可能使用的值无法用可用位准确表示

编辑

您可以使用以下代码检查此行为:

select CONVERT(DATETIME, '2013-09-04 16:21:23.450') -- returns 2013-09-04 16:21:23.450
select CONVERT(DATETIME, '2013-09-04 16:21:23.451') -- returns 2013-09-04 16:21:23.450
select CONVERT(DATETIME, '2013-09-04 16:21:23.452') -- returns 2013-09-04 16:21:23.453
select CONVERT(DATETIME, '2013-09-04 16:21:23.453') -- returns 2013-09-04 16:21:23.453
select CONVERT(DATETIME, '2013-09-04 16:21:23.454') -- returns 2013-09-04 16:21:23.453
select CONVERT(DATETIME, '2013-09-04 16:21:23.455') -- returns 2013-09-04 16:21:23.457
底线

不要试图识别带有日期时间的行…

SQL Server类型仅精确到.000、.003或.007秒的增量

因此,当您使用.450保存一个值时,就可以了。但是如果你用.451保存,那会被四舍五入回到.450,然后它就不匹配了

可以通过使用列类型来避免这种情况

另外,您可能不应该在数据库中存储DateTime

如果你用这个怎么办

从表中选择*,其中convertdate,yourcolumn=convertdate,your\u datetime


但请注意,它将只在日期进行比较

在将字符串与数据库值进行比较时,SQL Server可以以多种方式表示日期时间。有些人有月前一天,有些人有月前一天。SQL Server的本地化导致了您的问题;你可以阅读更多关于它的内容。具体来说,请查找SET DATEFORMAT。

为什么要按时间戳标识行?如果两个用户插入具有相同时间戳的行怎么办?可能是日期的本地化问题。为了便于将来参考,您可以选择代码并按下{}按钮,它将为您设置格式,也可能是舍入问题。确实要精确查询该值吗?请尝试从TIMECOLUMN=convertdatetime的表中选择*,'2013-09-04 16:21:23.450',121但只有一种起始YYYY格式,即YYYY-MM-DD。我怀疑op被转置。这与Microsoft在链接上的文档不符。确定+1。但我找不到该格式的转换。这对我来说是失败的:选择cast'2013-15-04 16:21:23.450'作为datetime,我甚至找不到有效的转换格式。
select CONVERT(DATETIME, '2013-09-04 16:21:23.450') -- returns 2013-09-04 16:21:23.450
select CONVERT(DATETIME, '2013-09-04 16:21:23.451') -- returns 2013-09-04 16:21:23.450
select CONVERT(DATETIME, '2013-09-04 16:21:23.452') -- returns 2013-09-04 16:21:23.453
select CONVERT(DATETIME, '2013-09-04 16:21:23.453') -- returns 2013-09-04 16:21:23.453
select CONVERT(DATETIME, '2013-09-04 16:21:23.454') -- returns 2013-09-04 16:21:23.453
select CONVERT(DATETIME, '2013-09-04 16:21:23.455') -- returns 2013-09-04 16:21:23.457