2011-08-18 79 views
0

我在C#中有以下一段代码,我使用它从SQL Server表中根据日期标准选择一些行。查询根据日期标准从SQL Server表返回数据

DateTime From, DateTime To 
SqlParameter[] oParam = new SqlParameter[3]; 
oParam[0] = new SqlParameter("@From", From.Date); 
oParam[1] = new SqlParameter("@To", To.Date); 
DataTable dt = clsDatabaseHistory.ExecuteReader("SELECT * FROM tblHistory WHERE Date_Requested BETWEEN @From and @To", oParam); 

例如,如果From=18/08/2011To=18/08/2011且有数据在具有Date_Requested价值18/08/2011查询不会返回表tblHistory

但是,如果我从18/08/2011改变To价值To=19/08/2011查询将返回我从有18/08/2011一个Date_Requested值表中的所有值,但没有从19/08/2011

这怎么可能,我应该用什么查询来返回日期字段在date1和date2之间的行。

喜欢的东西:

select * rows where datevalue >= date1 and datevalue <= date2 

谢谢。

+0

http://stackoverflow.com/questions/749615/does-ms-sql-servers-between-include-the-range-boundaries – sll

回答

0

更改您的查询使用> =和<

select * rows where datevalue >= date1 and datevalue < date2 + 1 
0

From.Date and To.Date获取c#端的日期部分忽略时间部分;你需要在数据库端做类似的事情。

尝试

"SELECT * FROM tblHistory WHERE cast(Date_Requested as DATE) BETWEEN @From and @To" 

以除去时间部分。

编辑: 如本answer解释,你可以改变@To参数值的方式来

 oParam[1] = new SqlParameter("@To", To.Date.AddDays(1)); 
0

我敢打赌,你的Date_Requested在你的餐桌也有与它相关的一些时间 - 所以它可能真的是18/08/2011 14:37什么像那样。

BETWEEN条款将选择18/08/2011 00:00:0018/08/2011 00:00:00之间的任何内容 - 基本上什么都不是。

DATETIME一起工作时需要考虑的事实是总是有涉及的TIME

如果你想要的一切在今天,你需要使用:

BETWEEN `18/08/2011 00:00:00` AND `18/08/2011 23:59:59` 

有了这两个值,你应该得到今天的Date_Requested所有行。

OR:在SQL Server 2008及更新版本中,您还可以使用DATE列类型,它只存储日期 - 不涉及时间部分。在这种情况下,你应该对你的查询值很好。

0

你需要考虑时(不只是日期)。我处理这个问题的方法是这样的:

SELECT 
... 
WHERE CONVERT(varchar(8), date_begin, 112) <= convert(varchar(8), @to, 112) 

这个转换日期YYYYMMDD格式(无时间),这是很容易<, >, = comparrisons使用。

0

好,感谢大家,我已经做了以下事情

oParam[2] = new SqlParameter("@To", To.Date.AddDays(1)); 

,并使用了以下选择

SELECT * from MyTable WHERE CONVERT(varchar(8), Date_Requested, 112) >= CONVERT(varchar(8), @From, 112) and CONVERT(varchar(8), Date_Requested, 112) < CONVERT(varchar(8), @To, 112) 

日期时间变量必须转换进行比较。

谢谢大家!