SQL,按BETWEEN日期选择记录行

时间:2016-10-28 23:03:22

标签: sql sql-server tsql

典型的场景/应用是使用以下数据/表结构进行搜索:

StartDate TheVersion
day1 ver1
day2 ver2

即,每个 new 版本号都记录在一个带有开始日期的表中。

因此,对于给定日期,如果它在day1day2之间,并且day1day2是表格中最相邻的记录,那么{{1应该返回。

问题在于我无法使用SQL BETWEEN子句,因为ver1day1实际上来自不同的行。

怎么做?我想到了几种不同的方式,但没有一种方法不凌乱。通用SQL或T-SQL赞赏。我在SQL Server 2008R2 BTW上。谢谢。

2 个答案:

答案 0 :(得分:3)

使用SQL Server 2012,您可以访问行的下一个(或上一个)值,如下所示:

WITH cteWithNext AS (
  SELECT *, LEAD(StartDate) OVER (ORDER BY StartDate) EndDate
  FROM YourTable
)
SELECT n.*
  FROM cteWithNext n
  WHERE dt >= n.StartDate AND dt < n.EndDate

对于较旧的SQL Server版本,您可以自行加入虚拟索引,如下所示:

WITH cteNumbered AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY StartDate) num
  FROM YourTable
)
SELECT n1.*
  FROM cteNumbered n1
  JOIN cteNumbered n2 ON n1.num+1=n2.num
  WHERE dt >= n1.StartDate AND dt < n2.StartDate

使用这些方法,您可以使用普通的比较运算符(如果语义符合您的需要,甚至可以使用BETWEEN。)

答案 1 :(得分:2)

如果我理解正确,您希望获得在Given_Date时生效的版本。这是一个嵌套查询,首先在Given_Date之前或之前获取最大StartDate,然后返回附加到该日期的版本:

SELECT
Version_Table.StartDate,
Version_Table.TheVersion
FROM
Version_Table
INNER JOIN 
    (SELECT
    Max(StartDate)
    FROM
    Version_Table
    WHERE 
    StartDate <= Given_Date) maxdate on maxdate.startdate = version_table.startdate