SQL Fiddle
查询1:
WITH dates (date_start, date_end) AS (
SELECT DATE '2013-02-01', DATE '2013-04-05' FROM DUAL
)
SELECT 'M' AS period,
ADD_MONTHS(TRUNC(date_start, 'MM'), LEVEL - 1) AS range_start,
ADD_MONTHS(TRUNC(date_start, 'MM'), LEVEL) - INTERVAL '1' DAY AS range_end
FROM dates
CONNECT BY
ADD_MONTHS(TRUNC(date_start, 'MM'), LEVEL - 1) <= TRUNC(date_end, 'MM')
UNION ALL
SELECT 'Q' AS period,
ADD_MONTHS(TRUNC(date_start, 'Q'), 3 * (LEVEL - 1)) AS range_start,
ADD_MONTHS(TRUNC(date_start, 'Q'), 3 * LEVEL) - INTERVAL '1' DAY AS range_end
FROM dates
CONNECT BY
ADD_MONTHS(TRUNC(date_start, 'Q'), 3 * (LEVEL - 1)) <= TRUNC(date_end, 'Q')
UNION ALL
SELECT 'Y' AS period,
ADD_MONTHS(TRUNC(date_start, 'Y'), 12 * (LEVEL - 1)) AS range_start,
ADD_MONTHS(TRUNC(date_start, 'Y'), 12 * LEVEL) - INTERVAL '1' DAY AS range_end
FROM dates
CONNECT BY
ADD_MONTHS(TRUNC(date_start, 'Y'), 12 * (LEVEL - 1)) <= TRUNC(date_end, 'Y')
Results:
| PERIOD | RANGE_START | RANGE_END |
|--------|----------------------------|----------------------------|
| M | February, 01 2013 00:00:00 | February, 28 2013 00:00:00 |
| M | March, 01 2013 00:00:00 | March, 31 2013 00:00:00 |
| M | April, 01 2013 00:00:00 | April, 30 2013 00:00:00 |
| Q | January, 01 2013 00:00:00 | March, 31 2013 00:00:00 |
| Q | April, 01 2013 00:00:00 | June, 30 2013 00:00:00 |
| Y | January, 01 2013 00:00:00 | December, 31 2013 00:00:00 |
他们是日期/时间戳还是字符串? – Matt
问题有点暧昧。请详细说明。 –
问题不清楚。你想要一个sql语句吗?请举个例子。 – Jack