TSQL: 日期 BETWEEN 查询 - 忽略时间

11

我正在尝试在两个日期之间查询。我希望能够在不考虑时间的情况下进行查询。当用户输入他们想要搜索的两个日期时,没有选择时间的选项。这意味着他们输入的日期默认为上午12:00。

表中的日期确实有时间。但我只想忽略所有时间,以便搜索返回指定日期范围内的任何记录。

以下是我的SQL:

TheDate BETWEEN @EnteredBeginDate AND @EnteredEndDate

因此,当用户在8/6/2009到9/9/2009之间进行范围搜索时,我希望返回记录:

8/6/2009 11:33:02 AM
8/6/2009 11:39:17 AM
9/9/2009 8:21:30 AM

现在发生的是我只收到了:

8/6/2009 11:33:02 AM
8/6/2009 11:39:17 AM

能否有人推荐一下在SQL中最好的做法?我知道在C#中怎么做。


SQL Server 的哪个版本? - marc_s
5个回答

10

只需使用DATEADD函数来设置结束日期为次日午夜...

TheDate BETWEEN @EnteredBeginDate AND DATEADD(day, 1, @EnteredEndDate)

如果你想更精确,可以从该日期减去一秒或一毫秒,使其成为指定日期的11:59:59:

TheDate BETWEEN @EnteredBeginDate AND DATEADD(second, -1, (DATEADD(day, 1, @EnteredEndDate)))


这将是我选择的答案。精确选项加1分。谢谢大家! - Jared
如果你想要非常非常精确,你可以将其转换为datetime2并减去一百纳秒 ;) :) TheDate BETWEEN @EnteredBeginDate AND DATEADD(nanosecond, -100, DATEADD(day, 1, CAST(@EnteredEndDate AS datetime2))) - Caltor

8
如果您正在使用SQL Server 2008或2008 R2,您可以使用新的日期数据类型DATE
TheDate BETWEEN CAST(@EnteredBeginDate AS DATE) AND CAST(@EnteredEndDate AS DATE)

这会去掉时间部分,只关注日期


这很棒。不过我必须使用2005年的版本。 - Jared
你需要将 TheDate 进行 CAST 转换,而不是输入的日期。因此应该是 CAST(TheDate AS DATE) BETWEEN @EnteredBeginDate AND @EnteredEndDate - Caltor

2
如果您正在使用SQL Server 2008,请按照以下步骤进行操作:
TheDate BETWEEN cast(@EnteredBeginDate as date) AND cast(@EnteredEndDate as date)

由marc_s在stackoverflow上的早期答案的副本 https://dev59.com/CGoy5IYBdhLWcg3wieu6#8478056 - Caltor

1
TheDate BETWEEN @EnteredBeginDate AND dateadd(day, 1, @EnteredEndDate)

3
如果您要发布代码、XML或数据样本,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮({ })以使其格式化并进行语法突出显示! - marc_s

0
如果只传递日期到SQL Server,它会将时间设置为上午12:00。因此,在between子句中的结束日期是9/9/2009 12:00 AM。只需添加一天或修改传递到查询中的日期以包括正确的时间即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接