-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 に答える