没有时间的SQL日期搜索

时间:2009-02-13 21:10:48

标签: asp.net sql-server

我有一个按日期搜索的查询。数据库中的日期包括时间。如何仅搜索日期。

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);

6 个答案:

答案 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

希望这有帮助。