0

現在、次の問題に対する SQL ソリューションを探しています。

ガイダンスとしてのSQLFiddle :

null 不可の startdates と nullable enddates のリストがあります。このリストに基づいて、特定の開始日と終了日の間の合計ギャップ時間が必要です。

SQLFiddle に基づく

データベースに状況 1 しかない場合、結果は 2 日になるはずです。データベースに状況 2 と 3 がある場合、結果は 1 日になるはずです。

私はこれを数日間熟考してきました...どんな助けも大歓迎です!

よろしく、 キョー

注: SQL 2012 を実行しています (特別な新機能が必要な場合)

4

2 に答える 2

1

最善の解決策は、「Dates」テーブルを作成してそこから開始することです。そうしないと、解決策を維持できなくなります。指定された範囲の各日付について、「dateranges」テーブルの範囲に含まれているかどうかを確認し、含まれていない日付の数を取得できます。

このようなもの:

SELECT COUNT(*)
FROM
  Dates d
WHERE
  d.Date BETWEEN @start AND @end
AND NOT EXISTS 
 (SELECT * 
  FROM dateranges r
  WHERE d.date BETWEEN r.startdate and ISNULL(r.enddate, d.date) 
  )
于 2013-02-04T13:22:51.117 に答える
0
    CREATE TABLE Dates (
 dt DATETIME NOT NULL PRIMARY KEY);

INSERT INTO Dates VALUES('20081204'); 
INSERT INTO Dates VALUES('20081205');
INSERT INTO Dates VALUES('20090608');
INSERT INTO Dates VALUES('20090609');

-- missing ranges
SELECT DATEADD(DAY, 1, prev) AS start_gap,
       DATEADD(DAY, -1, next) AS end_gap,
       DATEDIFF(MONTH, DATEADD(DAY, 1, prev), 
                       DATEADD(DAY, -1, next)) AS month_diff
FROM (
SELECT dt AS prev, 
      (SELECT MIN(dt) 
       FROM Dates AS B
       WHERE B.dt > A.dt) AS next
FROM Dates AS A) AS T
WHERE DATEDIFF(DAY, prev, next) > 1;

-- existing ranges
SELECT MIN(dt) AS start_range,
       MAX(dt) AS end_range
FROM (
SELECT dt, 
       DATEDIFF(DAY, ROW_NUMBER() OVER(ORDER BY dt), dt) AS grp
FROM Dates) AS D
GROUP BY grp;

DROP TABLE Dates; 
于 2013-02-04T12:38:07.877 に答える