-1

I need display a list of dates in SQL. Already I have an input with single row for n number codes.

Present Table Structure (dates in day/month/year format):

Code FromDate   ToDate     Total Days

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

I need output as:

Code FromDate

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

2 回答 2

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;
于 2012-11-01T11:22:40.240 回答
1

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

如果您根据 Dimension 表和 Fact 表来考虑您的数据库,那么您的开始和结束日期只是隐含 Dimension 的关键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
  • 财政年
  • 等等等等

有人批评这种做法不雅。我个人的感觉恰恰相反:
- 它缓存了基于日期的混乱计算
- 它明确地创建了一个维度表

它甚至被 TeraData 使用,效果非常好:sys_calendar.calendar.

于 2012-11-01T11:36:09.823 回答