2010-11-18 108 views
0

我有一个包含一个日期列的表说特殊日期(存储为YYYYMMDD)SQL查询创建的日期范围与单个日期列

如何创建行的小部分中的日期范围?

实施例表包含01-JAN-2010,01-FEB-2010,01-MAR-2010

我需要

01-jan-2010 - 01-feb-2010 
01-feb-2010 - 01-mar-2010 

.... 具有以下值的日期列.. ..

请帮忙。

+0

我不知道我按照你想要的。你是说在你的示例表中有三个日期,并且你想要一个select语句返回四个,'20100201'重复一次? – 2010-11-18 08:13:12

+0

我认为这个想法是,输出显示一个特殊的日期范围,其中结束日期是下一个特殊的开始日期。你应该考虑有两列开始日期,结束日期,因为它会使生活变得更简单和更具可扩展性......如果你有两件特别的东西,那么会发生什么? – Rob 2010-11-18 08:18:11

回答

2

您可以通过使用

SELECT s.DateVal StartDate, 
     MIN(e.DateVal) EndDate 
FROM @Table s LEFT JOIN 
     @Table e ON s.DateVal < e.DateVal 
GROUP BY s.DateVal 
HAVING MIN(e.DateVal) IS NOT NULL 

尝试像

DECLARE @Table TABLE(
     DateVal DATETIME 
) 

INSERT INTO @Table SELECT '01 Jan 2010' 
INSERT INTO @Table SELECT '01 Feb 2010' 
INSERT INTO @Table SELECT '01 Mar 2010' 

;WITH DateVals AS (
    SELECT *, 
      ROW_NUMBER() OVER(ORDER BY DateVal) RowID 
    FROM @Table 
) 
SELECT s.DateVal StartDate, 
     e.DateVal EndDate 
FROM DateVals s INNER JOIN 
     DateVals e ON s.RowID + 1 = e.RowID 

输出

StartDate     EndDate 
2010-01-01 00:00:00.000 2010-02-01 00:00:00.000 
2010-02-01 00:00:00.000 2010-03-01 00:00:00.000 

可以避开CTE但我不明白为什么你想这样做。

+0

有什么办法可以避免CTE? – SumSang 2010-11-18 08:16:24

+0

CTE不坏?对于初学者问题可能会感到抱歉 – SumSang 2010-11-18 08:54:08