根据日期条件从SQL Server表返回数据的查询

本文关键字:返回 数据 查询 Server SQL 日期 条件 | 更新日期: 2023-09-27 18:05:54

我在c#中使用以下代码,用于根据日期标准从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中存在表tblHistoryDate_Requested值为18/08/2011的数据,则查询不返回该值。

但是,如果我将To的值从18/08/2011更改为To=19/08/2011,则查询返回表中Date_Requested值为18/08/2011的所有值,但19/08/2011没有。

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

例如:

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

谢谢。

根据日期条件从SQL Server表返回数据的查询

将查询改为使用>= and <</p>

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

我打赌你的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的所有行。

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

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

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

删除时间部分。

编辑:如本回答所述,您可以将@To参数值更改为

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

您需要考虑时间(而不仅仅是日期)。我处理它的一种方法是:

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

将日期转换为YYYYMMDD格式(没有时间),这在<, >, =比较中非常容易使用。

好了,谢谢大家,我做了以下的事情

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

并使用下面的select

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)

日期时间变量必须经过转换才能进行比较。

谢谢!