我的查询有点问题。我正在使用between命令选择数据,但是当我选择初始日期等于最终日期时,查询不会显示数据。
我知道问题是格式。在我的数据库中,我有这样的事情:2009-05-22 15:32:52.000。但是当我从ASP.NET页面发送日期参数时,我只发送了日期(2009-05-22)。
所以,我想解决这个问题。我无法更改数据库中的日期时间。
我想在最后的日期添加1天,所以当用户选择相同的日期时,我会更改场景背后的范围,然后显示数据。你怎么看?
你会做什么?
答案 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)
这不会留下任何东西......