【问题标题】:Need help to create a SQL query where clause需要帮助来创建 SQL 查询 where 子句
【发布时间】:2014-06-20 08:01:49
【问题描述】:

我有一个表,其中有 8 列,其中 2 列是 ToFrom 这些数据类型为日期时间。我想在这两个字段上使用一些过滤器执行选择查询。

现在看下面的例子

Record X = From "5 May" to  "18 May" 

Filter 1: from "5 May" to "5 May" … x should show 

Filter 2: from "10 May" to "10 May" … x should show

Filter 3: from "1 May" to "1 May" … x should NOT show

Filter 4: from "19 May" to "19 May" … x should NOT show

Filter 5: from "18 May" to "18 May" … x should show 

Filter 6: From "4 May" to  "17 May" ….  X should show

Filter 7: From "4 May" to  "18 May" ….  X should show

Filter 8: From "4 May" to  "19 May" ….  X should show

Filter 9: From "5 May" to  "17 May" ….  X should show

Filter 10: From "5 May" to  "18 May" ….  X should show

Filter 11: From "5 May" to  "19 May" ….  X should show

Filter 12: From "2 May" to  "3 May" ….  X should NOT show

Filter 13: From "20 May" to  "25 May" ….  X should NOT show

所以基本上逻辑是 如果过滤日期范围和数据库日期范围之间有共同的日期,则记录应显示在结果中。

你能帮帮我吗?看了这么多配置,我一头雾水。

【问题讨论】:

  • 您确实应该通过将其作为实际的表格数据而不是这些解释列来更清楚地说明这一点。特别是考虑到您假定的数据类型。我假设你也只想要一个特定的年份,是吗?
  • Comparing date ranges 的副本(知道我在某处见过这些)。由于您似乎正在处理时间戳,我建议您使用独占上限 (<),而不是 several reasons detailed on this blog post

标签: sql sql-server filter where-clause select-query


【解决方案1】:
SELECT *
FROM YourTable
WHERE from >= '5/5/2014'
  AND from < '5/6/2014'
  AND to >= '5/5/2014'
  AND to < '5/6/2014'

不会像过滤器 1 那样简单吗?还是您需要 1 个查询中的所有过滤器?

【讨论】:

  • 是的,他需要一个查询的所有过滤器。
【解决方案2】:

您需要 fromto 列在过滤器定义的范围内,包括:

declare @filter_from datetime, @filter_to datetime

select *
from <table>
where col_from between @filter_from and @filter_to
  or col_to between @filter_from and @filter_to
  or @filter_from between col_from and col_to
  or @filter_to between vol_from and col_to

【讨论】:

  • 特别是因为这是 SQL Server,he's going to want to avoid BETWEEN
  • 不,他不会,尽管互联网上的一些博客说,between 是一个温和的运营商,非常适合这种特殊情况。
  • 实际上,BETWEEN 不是 在这里非常合适,因为:1) 由于 OP 声明的类型是 DATETIME,他需要做一些复杂的工作安全使用BETWEEN 和2)提供的范围不正确(您的答案错过了Filter# 8,鉴于他的搜索条件) - 检查链接副本中的答案。就个人而言,我认为应该避免使用BETWEEN,因为它促进了一种危险/错误的思维方式:存在一种独特的结束值。这适用于除整数类型之外的所有内容! ....为了保持一致性,应该避免它。
  • OP 明显使用datetime 没有时间部分;然而,between 只是 `x >= a 和 x
  • 嗯?呃,OP离开了,所以不知道他到底存了什么。在博客中,建议使用独占上限 (&lt;),这意味着没有额外的工作。很明显,您没有阅读链接的问题/答案,因为您只需要两个条件(而不是八个)。
【解决方案3】:

试试这个

Select * from table_name where startDate between '4 May' and '18 May'
And endDate between '5 May' and '19 May'

谢谢。希望对你有帮助

【讨论】:

猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2011-04-03
相关资源
最近更新 更多