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

C# 使用相同日期查询数据库不会返回数据,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我有一点疑问。我使用between命令选择数据,但当我选择与最终日期相等的初始日期时,查询不会显示数据 我知道问题在于格式。在我的数据库中,我得到了这样的信息:2009-05-2215:32:52.000。但是当我从ASP.NET页面发送日期参数时,我只发送了日期(2009-05-22) 所以,我想解决这个问题。我无法更改数据库中的日期时间 我想在最后的日期加上一天,所以当用户选择相同的日期时,我会改变场景后面的范围,然后显示数据。你觉得怎么样 您会怎么做?在将int传递给select之前,尝试

我有一点疑问。我使用between命令选择数据,但当我选择与最终日期相等的初始日期时,查询不会显示数据

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

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

我想在最后的日期加上一天,所以当用户选择相同的日期时,我会改变场景后面的范围,然后显示数据。你觉得怎么样


您会怎么做?

在将int传递给select之前,尝试修改end date参数。因此,如果结束日期为2009-05-22,则将其设置为2009-05-22 23:59:59.00。我知道这不是硬编码这类事情的最佳解决方案,但这很容易做到

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

当我需要获取一天的所有结果时,我创建一个没有时间成分的日期时间(0:00),然后加上一天,减去一秒,得到时间成分为23:59:59的日期时间。NET中的DateTime类使这变得非常简单

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

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

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

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

注意比较运算符中的差异;范围的末尾不包括在内。

您有两个选项。。。通过添加输入的搜索日期的一天,然后执行日期范围,或者运行select,将数据库中的部分日期与为使用DATEPART进行搜索而提供的数据进行比较,从而秘密地执行日期范围

如果你要做一个数据范围,那么就去做

其中日期>=“输入日期”和数据<“输入日期+1”


如果用户使用的查询是严格的日期(即,用户没有输入时间的选项),那么我肯定会在数据库中创建一个只与日期时间列匹配的日期列,而不是试图捕捉一天的最后一秒,这样您就可以执行。这最好使用函数来完成,因为您不想维护同一数据的第二个副本。然后查询该列

我建议不要进行任何1秒到午夜的范围,因为数据类型的粒度小于1秒,因此这种范围是不正确的


或者,如果你把时间从一个中间值改为一个中间值,那么最初的建议是取消时间,并在时间范围内增加一整天的时间,这应该是可行的“table.column如果您输入的是say@matchDate。。。您可以为您的范围创建开始/结束日期。您应该使用@startDate作为日期的0时间点,@endDate为该值+1。您需要匹配>=@startDate和<@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
@matchDate-DATETIME--使用给定的DATETIME传入
...
声明@startDate DATETIME;
声明@endDate-DATETIME;
--这将为您提供不含时间部分的日期时间,请注意
--如果要以UTC格式存储日期,则需要传入起始日期
--DateTime为UTC零小时,并跳过此转换。
设置@startDate=DATEADD(day,0,DATEDIFF(day,0,@created_date))
--这将为您提供@startDate+1天
设置@endDate=DATEADD(dd,1,@startDate);
...
选择。。。
从…起
其中[MyDateCol]>=@startDate和[MyDateCol]<@endDate
当您对给定的日期进行匹配时,最好指定一个范围,您可以将匹配日期和列日期减少到日期部分,但这比对范围使用>=和<性能要差


同样,在UTC中存储时,您希望以UTC为起点和终点。这是我为服务于多个时区的应用程序推荐的。我最近发布了一篇文章,如果你感兴趣的话,其中包括一个日期时间匹配。

给出的几个答案将非常有用,如果你感兴趣的话,我一直在使用这个方法

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

这没有留下任何空间来进行任何更改您可以为我们发布一些代码来帮助我们更好地理解问题吗?我现在就到了,所以我会检查我能做些什么。谢谢。出于好奇,为什么不使用另一个构造函数并传入23、59、59呢?这实际上是不对的,因为精度比第二个更好。你需要降低到大约3.5毫秒,否则你每天会缺一整秒钟。是的,我缺了一秒钟,但就我的目的而言,精确度是非常好的。如果需要更高的精度,可以使用addMillimess()函数。我可以使用构造函数传入23、59、59,但通常我不只是寻找一整天,我可能需要12小时的范围或类似的时间。示例代码有点简单,但它显示了总体思路。这可以解决我的问题。我会尽力去做的。谢谢你提供的信息。此外,一天中的小时数多久会改变一次?它会在工作时间(上午8:00到下午5:00)改变,有时会一直到晚上8:00。