如何在sql中选择连续日期

Gin*_*iha 6 sql sql-server

是否有任何功能来检查连续日期.我在解决以下问题时遇到问题:

我的表有一个datetime包含以下数据的列:

----------
2015-03-11
2015-03-12
2015-03-13
2015-03-16
Run Code Online (Sandbox Code Playgroud)

给定开始日期2015-3-11和结束日期为2015-3-17.我希望结果如下:

----------
2015-03-11
2015-03-12
2015-03-13
Run Code Online (Sandbox Code Playgroud)

谁能提出任何建议?

Fel*_*tan 6

我认为这有点像连续日期分组岛的问题.这可以使用ROW_NUMBER():

SQL小提琴

CREATE TABLE Test(
    tDate   DATETIME
)
INSERT INTO Test VALUES
('20150311'), ('20150312'), ('20150313'), ('20150316');

DECLARE @startDate  DATE = '20150311'
DECLARE @endDate    DATE = '20150317'

;WITH Cte AS(
    SELECT
        *,
        RN = DATEADD(DD, - (ROW_NUMBER() OVER(ORDER BY tDATE) - 1), tDate)
    FROM Test
    WHERE 
        tDate >= @startDate
        AND tDate < DATEADD(DAY, 1, @endDate)
)
SELECT CAST(tDate AS DATE)
FROM CTE
WHERE RN = @startDate
Run Code Online (Sandbox Code Playgroud)

结果

|------------|
| 2015-03-11 |
| 2015-03-12 |
| 2015-03-13 |
Run Code Online (Sandbox Code Playgroud)

这是SQL Server 2005版本:

SQL小提琴

DECLARE @startDate  DATETIME
DECLARE @endDate    DATETIME

SET @startDate  = '20150311'
SET @endDate    = '20150317'

;WITH Cte AS(
    SELECT
        *,
        RN = DATEADD(DD, -(ROW_NUMBER() OVER(ORDER BY tDATE)-1), tDate)
    FROM Test
    WHERE 
        tDate >= @startDate
        AND tDate < DATEADD(DAY, 1, @endDate)
)
SELECT CONVERT(VARCHAR(10), tDate, 121)
FROM CTE
WHERE RN = @startDate
Run Code Online (Sandbox Code Playgroud)