SQL查询创建的日期范围与单个日期列
问题描述:
我有一个包含一个日期列的表说特殊日期(存储为YYYYMMDD)SQL查询创建的日期范围与单个日期列
如何创建行的小部分中的日期范围?
实施例表包含01-JAN-2010,01-FEB-2010,01-MAR-2010
我需要
01-jan-2010 - 01-feb-2010
01-feb-2010 - 01-mar-2010
.... 具有以下值的日期列.. ..
请帮忙。
答
您可以通过使用
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但我不明白为什么你想这样做。
我不知道我按照你想要的。你是说在你的示例表中有三个日期,并且你想要一个select语句返回四个,'20100201'重复一次? – 2010-11-18 08:13:12
我认为这个想法是,输出显示一个特殊的日期范围,其中结束日期是下一个特殊的开始日期。你应该考虑有两列开始日期,结束日期,因为它会使生活变得更简单和更具可扩展性......如果你有两件特别的东西,那么会发生什么? – Rob 2010-11-18 08:18:11