根据日期条件从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/2011
和To=18/08/2011
中存在表tblHistory
中Date_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
谢谢。
将查询改为使用>= and <</p>
select * rows where datevalue >= date1 and datevalue < date2 + 1
我打赌你的Date_Requested在你的表中也有一些与它相关的时间-所以它可能真的是18/08/2011 14:37
或类似的东西。
BETWEEN
子句将选择18/08/2011 00:00:00
和18/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.Date
和To.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)
日期时间变量必须经过转换才能进行比较。
谢谢!