从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在将字符串与数据库值进行比较时,可以用多种方式表示日期时间。有些人是在前一天,有些人是前一天。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
存储在数据库中。请阅读此处。