【问题标题】:filter for dates that fall in between start date and end date?过滤开始日期和结束日期之间的日期?
【发布时间】:2013-10-08 23:00:23
【问题描述】:

我有一个日期时间列,我想过滤两个开始日期和结束日期参数。但是,如果 startd ate 和 end date 是相同的值,则不会返回任何行。

ua.actiondate < '2013-10-08' and ua.actiondate  > '2013-10-08'

ua.actiondate between '2013-10-08' and '2013-10-08'

我的 actionDate 列的示例值

2013-10-08 12:30:17.000
2013-10-08 12:30:17.000
2013-10-08 12:31:56.000
2013-10-08 12:32:22.000
2013-10-08 12:35:35.000
2013-10-08 12:35:40.000
2013-10-08 12:35:40.000
2013-10-08 12:36:03.000
2013-10-08 12:36:44.000
2013-10-08 12:36:44.000
2013-10-08 12:36:54.000

如您所见,actionDate 列是日期时间对象,但参数只是日期。

【问题讨论】:

  • 这些事件都没有发生在 2013 年 10 月 8 日午夜,所以我不希望它们中的任何一个被返回。

标签: sql sql-server


【解决方案1】:

你应该always use an open-ended date rangenever use between

WHERE ua.actiondate >= @startdate AND ua.actiondate < DATEADD(DAY, 1, @enddate);

这假定@startdate@enddate 总是作为没有时间的日期传递。如果涉及时间(例如,应用程序可能会通过 now()),那么您可以使用以下方法四舍五入:

WHERE ua.actiondate >= CONVERT(DATE, @startdate)
  AND ua.actiondate <  CONVERT(DATE, DATEADD(DAY, 1, @enddate));

【讨论】:

    【解决方案2】:

    由于2013-10-08 12:35:40.000 大于2013-10-08 你必须使用这样的东西

    where ua.actiondate >= '2013-10-08' and ua.actiondate  < '2013-10-09'
    

    【讨论】:

    • 是否可以只过滤日期部分?
    • @xerxes 你能详细说明一下吗?你的意思是你的参数可能包括时间?
    • 我的查询只过滤日期部分。您也可以使用DATE() 提取日期部分,但这不会使用表上的索引,这会使其变慢。
    • @juergend 实际上CONVERT(DATE()) 是我所知道的唯一一个可以对列使用并且仍然有一个sargable 子句的函数。不过,这并不是一个好的做法。 :-)
    最近更新 更多