使用相同日期查询数据库不会返回数据

时间:2010-03-02 16:00:04

标签: c# asp.net sql-server

我的查询有点问题。我正在使用between命令选择数据,但是当我选择初始日期等于最终日期时,查询不会显示数据。

我知道问题是格式。在我的数据库中,我有这样的事情:2009-05-22 15:32:52.000。但是当我从ASP.NET页面发送日期参数时,我只发送了日期(2009-05-22)。

所以,我想解决这个问题。我无法更改数据库中的日期时间。

我想在最后的日期添加1天,所以当用户选择相同的日期时,我会更改场景背后的范围,然后显示数据。你怎么看?

你会做什么?

8 个答案:

答案 0 :(得分:3)

2009-05-22将翻译为2009-05-22 00:00:00,因此设置开始和结束时只会选择恰好在午夜发生的记录。如果您没有太频繁地出现数据点,那么添加1天(午夜到午夜)通常就足够了。如果有大量数据,那么您最好将结束时间的时间部分设置为23:59:59.999

答案 1 :(得分:3)

当您发送2009-05-22之类的日期时,sql server会将其解释为2009-05-22 00:00:00.000。这意味着当您将该日期用于“初始日期等于最终日期”之间的查询之间时,您将检查的范围恰好是一毫秒。

相反,您需要将第二个值设置为当天结束,以便您的表达式涵盖整整一天的范围。或者,我首选的选项是使用两个这样的表达式:

WHERE ([datetimecolumn] >= '2009-05-22' AND [datetimecolumn] < '2009-05-23')

注意比较运算符的区别;范围的结束不包括在内。

答案 2 :(得分:1)

当我需要获得一天的所有结果时,我创建一个没有时间组件的DateTime(0:00),然后添加一天并减去一秒以获得时间分量为23:59:59的DateTime。 .NET中的DateTime类使这很容易。

                DateTime dtStart = new DateTime( 2009, 5, 22 );
            DateTime dtEnd = dtStart.AddDays( 1 ).AddSeconds( -1 );

答案 3 :(得分:1)

如果用户正在使用的查询是严格的日期(即,用户没有输入时间的选项),那么我肯定会在数据库中创建一个与日期时间列匹配的仅日期列(当然,除去时间)。这最好用一个函数完成,因为你不想维护相同数据的第二个副本。然后查询该列。

我建议不要做任何一秒到午夜的范围,因为数据类型的粒度小于一秒,因此这样的范围是不正确的。

或者,只要您将BETWEEN从BETWEEN更改为“table.column&lt; = @date AND @date&lt; table”,剥离时间并在该范围内添加一整天的原始提议就可以正常工作。列+ 1“(使其成为顶端的独占区间)。

答案 4 :(得分:0)

尝试在将int传递给select之前修改结束日期参数。所以,如果结束日期是2009-05-22,那么2009-05-22 23:59:59.00我知道这不是硬编码这类东西的最佳解决方案,但它很容易完成

答案 5 :(得分:0)

您有2个选项...要么通过在输入的搜索日期中添加一天,然后执行日期范围或运行您的选择来秘密地执行日期范围,您只需将数据库中的一部分日期与给定的数据进行比较搜索使用DATEPART。

http://msdn.microsoft.com/en-us/library/ms174420.aspx

http://www.w3schools.com/Sql/func_datepart.asp

如果你打算做一个数据范围,那就去做吧

日期&gt; ='输入日期'AND数据&lt; '输入日期+ 1'

而不是试图赶上当天的最后一秒,这样你就可以在一天结束时做一个&lt; =

答案 6 :(得分:0)

如果您输入了@matchDate ...您可以为您的范围创建开始/结束日期。您应该使用@startDate作为日期的0时间点,@ endDate为该值+1。您需要匹配&gt; = @startDate和&lt; @EndDate。

@matchDate DATETIME -- passed in with a given datetime
...
DECLARE @startDate DATETIME;
DECLARE @endDate DATETIME;

-- this will give you the DateTime without the Time part, note if you 
-- are storing dates in UTC, you will want to pass in your starting 
-- DateTime as the UTC zero hour, and skip this conversion.
SET @startDate = DATEADD(day, 0, DATEDIFF(day, 0, @created_date))

-- this will give you the @startDate + 1 Day
Set @endDate = DATEADD(dd, 1, @startDate);

...
SELECT ... 
FROM ... 
WHERE [MyDateCol] >= @startDate AND [MyDateCol] < @endDate

当您执行指定日期以进行匹配时,最好指定一个范围, COULD 将匹配日期和列日期减少到日期部分,但这将是性能低于使用&gt; =和&lt;对于范围。

同样,以UTC格式存储时,您需要以UTC开头。我推荐用于服务多个时区的应用。我最近发布了an article for doing paged results in a sproc,其中包括您感兴趣的日期时间匹配。

答案 7 :(得分:0)

给出的几个答案真的会有所帮助,我一直在使用这种方法,如果它能吸引你,

    Select * from table1 Year(DtaeColumn)=Year(@OurDate) and Month(DtaeColumn)=Month
(@OurDate)  and Day(DtaeColumn)=Day(@OurDate)

这不会留下任何东西......