繁体   English   中英

从SQL Server 2008 R2表中选择datetime列

[英]Select datetime column from SQL Server 2008 R2 table

我在SQL Server 2008 R2数据库的表上有一个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

select * from table 
where TIMECOLUMN = '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

底线

不要试图用日期时间来标识行...

如果使用这个怎么办

Select * from table where convert(date,yourcolumn)=convert(date,your_datetime)

但请注意,它将仅按日期进行比较

在将字符串与数据库值进行比较时,SQL Server可以通过多种方式表示日期时间。 有些在一天的前一天,有些在一天的前一天。 SQL Server的本地化导致了您的问题; 您可以在此处了解更多信息。 具体来说,寻找SET DATEFORMAT

SQL Server datetime类型仅精确到.000.003.007秒的增量。

因此,当您使用.450保存值时,就可以了。 但是,如果您使用.451保存, .451将其四舍五入为.450 ,然后它将不匹配。

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

另外-您可能不应该在数据库中存储DateTime.Now 在这里阅读

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM