如何从sql中的一组日期返回连续的日期范围

时间:2013-05-14 17:03:15

标签: sql sql-server-2008

我在sql中的表中有一组日期。我想返回日期范围,我需要帮助。

所以,如果我有这样的日期

PK  - Date                                      
160 - 2013-04-16 12:09:00   
160 - 2013-04-17 11:07:00   
162 - 2013-04-16 12:10:00   
160 - 2013-04-20 12:10:00   

我想要例如

PK   - beg                   -  end
160  -  2013-04-16 12:09:00  -  2013-04-17 11:07:00
160  -  2013-04-17 11:07:00  -  2013-04-20 12:10:00
162  -  2013-04-16 12:10:00  -  2013-04-16 12:10:00
你能帮我吗?

谢谢

我正在使用Microsoft SQL Server Management Studio 10.0.1600.22

1 个答案:

答案 0 :(得分:1)

以下是使用MS SQL Server 2008的示例(尽管应该适用于2005 +):

WITH CTE AS
(
  SELECT RowNum = ROW_NUMBER() OVER (PARTITION BY PK ORDER BY Date ASC), *
  FROM Dates
)
SELECT
  A.PK, A.Date [beg], COALESCE(B.Date, A.Date) [end]
FROM
  CTE A
  LEFT JOIN CTE B
    ON B.PK = A.PK AND B.RowNum = A.RowNum + 1
WHERE
  B.RowNum IS NOT NULL OR A.RowNum = 1

这将获得每个PK的行号,然后提供表和它自身之间的连接,过滤掉任何没有匹配的行,除非它们是该PK的第一行。

这是表格:

CREATE TABLE Dates (PK INT, Date DATETIME)

INSERT INTO Dates VALUES
  (160, '2013-04-16 12:09:00'),
  (160, '2013-04-17 11:07:00'),
  (162, '2013-04-16 12:10:00'),
  (160, '2013-04-20 12:10:00')

SQL小提琴here(希望 - 一直有问题)。