在SQL中显示开始日期和结束日期的日期列表

时间:2012-11-01 11:16:58

标签: sql

我需要在SQL中显示日期列表。我已经输入了n行代码的单行。

显示表格结构(日/月/年格式的日期):

Code FromDate   ToDate     Total Days

1    01/03/2012 04/03/2012   4
2    01/04/2012 05/04/2012   5

我需要输出为:

Code FromDate

1    01/03/2012
1    02/03/2012
1    03/03/2012
1    04/03/2012

2 个答案:

答案 0 :(得分:2)

WITH date_range (calc_date) AS (
    SELECT DATEADD(DAY, DATEDIFF(DAY, 0, '2010-01-13') - DATEDIFF(DAY, '2010-01-01', '2010-01-13'), 0)
        UNION ALL SELECT DATEADD(DAY, 1, calc_date)
            FROM date_range
            WHERE DATEADD(DAY, 1, calc_date) <= '2010-01-13')
SELECT calc_date
FROM date_range;

答案 1 :(得分:1)

虽然你可以编写推断日期的代码(例如SQL Server的VikramJain recursive CTE但它的CPU很重。如果您在大范围的时间内拥有大量记录,那么您将迭代地构建大量数据。而且每次查询数据时都会这样做。到目前为止,最有效的CPU方法就是拥有另一个表。

如果您根据维度表和事实表来考虑您的数据库,那么您的开始日期和结束日期只是隐含维度Time的关键字。而不是隐式,显式,并创建一个Calendar表。然后它是微不足道的......

SELECT
  yourTable.code,
  calendar.calendar_date
FROM
  yourTable
INNER JOIN
  calendar
    ON  calendar.calendar_date >= yourTable.fromDate
    AND calendar.calendar_date <  yourTable.toDate

这可能会节省大量CPU负载,并大大简化您的查询。

一旦你拥有了这个表,预先填充了所有你需要的日期,许多凌乱的日期操作就变成了简单的可索引查找。

您甚至可以向该表添加元数据,例如......

  • start_of_week
  • start_of_month
  • financial_year
  • 等等
有人批评这是不优雅的。我个人觉得相反:
- 它缓存基于日期的混乱计算 - 明确地创建维度表

TeraData甚至将它用于非常好的效果:sys_calendar.calendar