[英]Query to return data from SQL Server table based on date criteria
我有以下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
18/08/2011
和To=18/08/2011
18/08/2011
且表tblHistory
中的数据的Date_Requested
值为18/08/2011
则查询不会返回该数据。
但是,如果我将To
的值从18/08/2011
更改To=19/08/2011
Date_Requested
,则查询将返回表中所有Date_Requested
值为18/08/2011
值,但不会从19/08/2011
。
这样的事情怎么可能发生,我应该使用什么查询来返回日期字段在date1和date2之间的行。
就像是 :
select * rows where datevalue >= date1 and datevalue <= date2
谢谢。
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));
我敢打赌,您在表中的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
列类型,该类型仅存储日期-不涉及时间部分。 在这种情况下,您应该可以使用查询值。
更改查询以使用> =和<
select * rows where datevalue >= date1 and datevalue < date2 + 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 * 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)
日期时间变量必须进行转换才能进行比较。
谢谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.