我有一个按日期搜索的查询。数据库中的日期包括时间。如何仅搜索日期。
select *
from weblogs.dbo.vwlogs
where Log_time between @BeginDate and @EndDAte
and (client_user=@UserName or @UserName Is null)
order by Log_time desc
cmd.Parameters.AddWithValue("@BeginDate", txtBeginDate.Text);
cmd.Parameters.AddWithValue("@EndDAte", txtEndDate.Text);
答案 0 :(得分:3)
保持你的sql不变,只修复你的参数:
cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
DateTime.Parse(txtBeginDate.Text).Date;
cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
// add one to make search inclusive
DateTime.Parse(txtEndDate.Text).Date.AddDays(1);
您还需要检查以确保您的文本框首先是有效的日期时间,但您应该明白这一点。
这里唯一需要注意的是,由于BETWEEN运算符的怪癖,它将与第二天的第一个瞬间相匹配。所以,为了解决这个问题,我们编写了这样的查询:
SELECT *
FROM vwlogs
WHERE Log_time >= @BeginDate AND Log_Time < @EndDate
AND (client_user=@UserName OR @UserName IS NULL)
ORDER BY Log_time DESC
特别注意日期周围的比较运算符。
答案 1 :(得分:1)
在SQL中将开始和结束日期舍入为整个日期,并使用&gt; = @BeginDate,非常具体&lt; @结束日期。 “四舍五入”的过程并不是很优雅我害怕
e.g。
SELECT @BeginDate = DATEADD(Day, DATEDIFF(Day, 0, @BeginDate), 0),
@EndDAte = DATEADD(Day, DATEDIFF(Day, 0, @EndDAte) + 1, 0)
select *
from weblogs.dbo.vwlogs
where Log_time >= @BeginDate
and Log_time < @EndDAte
and (@UserName Is null OR client_user=@UserName)
order by Log_time desc
请注意,我首先移动了“@UserName Is null”,因为有一些证据表明此测试很容易通过/失败,并且会导致第二次CPU密集型测试(client_user = @ UserName)被忽略第一个测试是真的(当然可能是TommyRot ......)
另外,为了获得最佳性能,您应该明确命名所需的所有列,而不是使用“SELECT *”(但这可能只是出于此问题的目的)
答案 2 :(得分:1)
要做的第一件事就是从日期中删除时间。如果你想在sql server代码中执行此操作,可以使用类似下面的代码。我把它作为我工作的所有数据库的函数
cast(floor(cast(@fromdate as float)) as datetime)
接下来要担心的是标准。您需要确保选择从日期开始到结束日期的所有内容。您还需要确保一天的查询可以使用日期添加这样的
Where LogTime >= @fromdate and LogTime < DateAdd(dd, 1, @todate)
答案 3 :(得分:0)
如果你想改变sql,
TRUNC(Log_Time)会将每个日期时间减少到午夜的那个日期。
确保在列上构建索引为TRUNC(Log_TIME),以便它可用。
答案 4 :(得分:0)
另一个问题 - 截断您的结束日期将不包括该日期!考虑:
WHERE Log_Time&gt; = @BeginDate AND Log_Time&lt; @EndDate
如果@EndDate被截断,它将是午夜,并且当天不匹配任何内容。你需要加一天!
答案 5 :(得分:0)
通过在查询之前添加以下行来清理日期......
select
@begindate=dateadd(day,datediff(day,0,@begindate),0),
@enddate=dateadd(ms,-3,dateadd(day,datediff(day,0,@enddate),1))
这将发言您的开始日期到最低可能时间(00:00:00.000),上限结束日期到最高可能时间(23:59: 59.997)。然后,您可以完全按照写入的方式保留BETWEEN查询。
select *
from weblogs.dbo.vwlogs
where Log_time between @BeginDate and @EndDAte
and (client_user=@UserName or @UserName Is null)
order by Log_time desc
希望这有帮助。