sql >> データベース >  >> RDS >> Mysql

Mysql欠落している日付範囲を検索

    日付間隔がネストまたは交差しない場合は、JOINでトリックを使用できます 結果セットを生成します。したがって、目的のレコードセットを選択するには、次のものが必要です。

    SELECT
      *
    FROM
    (SELECT 
      ends.point AS date_start, 
      starts.point AS date_end 
    FROM 
      (SELECT 
        d.date_end+INTERVAL 1 DAY AS point, 
        @n:[email protected]+1 AS num 
      FROM 
        d 
          CROSS JOIN (SELECT @n:=1) AS init0
      ) AS ends 
      INNER JOIN 
      (SELECT 
        d.date_start-INTERVAL 1 DAY AS point, 
        @m:[email protected]+1 AS num 
      FROM 
        d 
          CROSS JOIN (SELECT @m:=0) AS init1
      ) AS starts 
      ON ends.num=starts.num 
    UNION ALL 
      SELECT 
        '2014-01-01', 
        MIN(date_start) - INTERVAL 1 DAY AS date_end
      FROM 
        d 
      HAVING 
        date_end>'2014-01-01' 
    UNION ALL 
      SELECT 
        MAX(date_end)+INTERVAL 1 DAY AS date_start, 
        '2014-12-31' 
      FROM
        d 
      HAVING 
        date_start<'2014-12-31' 
    ) as dates
    WHERE
      date_start<=date_end
    ORDER BY 
      date_start;
    

    その結果

    +------------+------------+
    | date_start | date_end   |
    +------------+------------+
    | 2014-01-01 | 2014-03-04 |
    | 2014-04-11 | 2014-04-30 |
    | 2014-06-06 | 2014-07-09 |
    | 2014-08-16 | 2014-12-31 |
    +------------+------------+
    

    フィドル これはここにあります)

    テーブルを「完成」させるには、INSERT..SELECT SELECTを使用した構文 上記のクエリ。




    1. Oracleの日付から月の名前を取得する

    2. Postgresでは、特定の列に可能な値をどのように制限しますか?

    3. 複数レベルの役割を持つRBACのDBスキーマ

    4. SQL * Plusは、実行中のマシンから環境変数を読み取ることができますか?