在SQL Server中将日期列表转换为日期范围

在SQL Server中将日期列表转换为日期范围,sql,sql-server,date,Sql,Sql Server,Date,我有一个问题如下: SELECT [Date] FROM [TableX] ORDER BY [Date] 结果是: 2016-06-01 2016-06-03 2016-06-10 2016-06-11 我怎样才能得到以下几双 From To 2016-06-01 2016-06-03 2016-06-03 2016-06-10 2016-06-10 2016-06-11 如果您使用的是SQL Server 2012或更高版本,则可以使用该方法 从同一结果集中的后

我有一个问题如下:

SELECT  [Date] FROM [TableX] ORDER  BY [Date]
结果是:

2016-06-01
2016-06-03
2016-06-10
2016-06-11
我怎样才能得到以下几双

From        To
2016-06-01  2016-06-03
2016-06-03  2016-06-10
2016-06-10  2016-06-11

如果您使用的是SQL Server 2012或更高版本,则可以使用该方法

从同一结果集中的后续行访问数据,而无需在SQL Server 2016中使用自联接。LEAD以当前行之后的给定物理偏移量提供对行的访问

我想对你来说是这样的:

SELECT [Date] AS [From], LEAD([Date], 1) OVER (ORDER BY [Date]) AS [To]
FROM TableX
ORDER BY [Date]
请注意,在最后一行,[To]字段将为
NULL
。如果要删除该行,可以将其放入内部查询中:

SELECT *
FROM 
(
    SELECT [Date] AS [From], LEAD([Date], 1) OVER (ORDER BY [Date]) AS [To]
    FROM TableX
) x
WHERE [To] IS NOT NULL

因为从来没有像您所说的那样有任何间隙,所以您可以使用
DATEADD()


您只需为每个
日期添加行号即可

然后将所有这些行合并到下一行(最后一行除外)


SQL2008有点棘手的解决方案

declare @tbl table(dt datetime)
insert @tbl values
('2016-06-01'),
('2016-06-03'),
('2016-06-10'),
('2016-06-11')

;with cte as (
select dt, ROW_NUMBER() over(order by dt) rn --add number
from @tbl
),
newTbl as (
select t1.dt start, t2.dt [end]
from cte t1 inner join cte t2 on t1.rn+1=t2.rn
)
select *
from newTbl

结果如您所愿。

您的日期字段是否总是有连续的日期,而没有遗漏任何日期?这是错误的。它显示了4行,但应该是3行rows@scsimon对不起,它实际上不是顺序的。日期可能不同。它们是有序的、不同的,但不是递增的。
WITH cteDates AS
(
    SELECT  [Date],
            ROW_NUMBER() OVER (ORDER BY (SELECT [Date])) As RowNum
    FROM    TableX
)

SELECT  TOP(SELECT COUNT(*) - 1 FROM cteDates)
            [Date] [From],
            (SELECT [Date] FROM cteDates WHERE RowNum = d.RowNum + 1) [To]
FROM    cteDates d
declare @tbl table(dt datetime)
insert @tbl values
('2016-06-01'),
('2016-06-03'),
('2016-06-10'),
('2016-06-11')

;with cte as (
select dt, ROW_NUMBER() over(order by dt) rn --add number
from @tbl
),
newTbl as (
select t1.dt start, t2.dt [end]
from cte t1 inner join cte t2 on t1.rn+1=t2.rn
)
select *
from newTbl