【问题标题】:SQL query confusion for startdate and enddate开始日期和结束日期的 SQL 查询混淆
【发布时间】:2012-07-12 06:10:29
【问题描述】:

我有一张像这样的表(例如tableA):

|姓名 |开始日期 |结束日期 | |----------------------------------| |一个 | 2012-07-01 | 2013-06-30 | |乙 | 2011-05-01 | 2012-04-30 | | c | 2010-01-01 | 2013-12-31 | | d | 2013-01-01 | 2014-12-31 | |电子| 2011-07-01 | 2012-06-30 |

我想从2012-05-012012-10-31 之间活动的表中获取一个名称。从上表中得出的结果应该是 a,c 和 e

我所做的如下:

SELECT Name FROM tableA WHERE startdate<='2012-05-01' AND enddate>='2012-10-31'

但我没有得到正确的结果。

【问题讨论】:

  • 右边应该是:startdate>='2012-05-01' AND enddate
  • 您想要在整个期间有效的结果吗?
  • 你应该使用正确的、独立于语言的格式来指定DATETIME的日期 - 格式是yyyyMMdd - 所以试试:...WHERE startdate &lt;= '20120501' AND enddate &gt;= '20121031'。带有破折号的格式不安全,并且可能会根据您的 SQL Server 的语言设置而被误解。另外,您的比较运算符也应该反转 - 它应该大于或等于 20120501 并且小于或等于 20121031 - 对吧?
  • 因为没有人在他们的任何答案中提到它——最好避免将日期(没有时间)指定为YYYY-MM-DD——它们对 SQL Server 来说可能是模棱两可的。最好只使用不带分隔符的YYYYMMDD
  • @marc_s 和 @Damien_The_Unbeliever 对,我将使用 yyyyMMDD

标签: sql sql-server select select-query


【解决方案1】:
declare @T table
(
  Name char(1),
  Startdate datetime,
  Enddate datetime
)

insert into @T values
('a',     '20120701',  '20130630'), 
('b',     '20110501',  '20120430'), 
('c',     '20100101',  '20131231'), 
('d',     '20130101',  '20141231'), 
('e',     '20110701',  '20120630')

declare @StartDate datetime = '20120501'
declare @EndDate datetime = '20121031'

select Name
from @T 
where Startdate < @EndDate and
      Enddate > @StartDate

【讨论】:

  • 我得到了我想要的结果。 See this fiddle
  • 日期格式yyyyMMdd的新小提琴已更新here
  • 我要投票这个++++。看似简单,但当你盯着这类问题看了一段时间后,你就不太明白了。谢谢。
【解决方案2】:

比较运算符的位置正在创建问题检查此

SELECT Name FROM tableA WHERE startdate>='2012-05-01' AND enddate<='2012-10-31'

【讨论】:

  • 您应该针对数据尝试此查询。它根本不返回任何行。
  • @MikaelEriksson 它不会,因为表不包含给定日期范围内的任何记录。正如他在“2012 年 5 月 1 日和 2012 年 10 月 31 日之间活跃”之间的问题记录中所问的那样,意味着记录的开始日期应该大于或等于 2012 年 5 月 1 日,但如果问题是拥有该日期范围所在的所有记录,那么您的查询是正确的。可能是我解释错了!!!
  • SELECT Name FROM table1 WHERE startdate between '2012-05-01' AND '2012-10-31' or enddate between '2012-05-01' AND '2012-10-31'跨度>
  • OP 想要重叠的日期范围。不完全在区间内。
  • @Deepesh 再次查看问题。我想要 startdateenddate 之间存在 '2012-05-01''2012-10-31' 的结果
【解决方案3】:

如果您想查找在此期间发生的任何结果,请使用BETWEEN

SELECT Name FROM tableA WHERE startdate BETWEEN '2012-05-01' and '2012-10-31'

如果 test_expression 的值大于 BETWEEN,则返回 TRUE 或等于 begin_expression 的值且小于或等于 end_expression 的值。

如果 test_expression 的值小于,NOT BETWEEN 返回 TRUE begin_expression 的值或大于 end_expression。

【讨论】:

  • 如果我使用startdate BETWEEN '2012-05-01' and '2012-10-31',那么我将不会得到 a,因为它在该期间处于活动状态。
  • 根据您的问题a 的结束日期为“2013-06-30”。 BETWEEN 表达式仅在 startdate 和 enddate 都在指定日期之内(之间)时返回匹配项。