从SQL Server 2008 R2表中选择日期时间列

本文关键字:选择 日期 时间 SQL Server 2008 R2 | 更新日期: 2023-09-27 18:30:14

我在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();

表中行中的日期时间列如下:

2013-09-04 16:21:23.450

但是

select * from table 
where TIMECOLUMN = '2013-09-04 16:21:23.450' 

不返回任何结果。

从SQL Server 2008 R2表中选择日期时间列

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

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 datetime类型仅精确到.000.003.007秒的增量。

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

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

此外,您可能不应该将DateTime.Now存储在数据库中。请阅读此处。