Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Mysql Znajdź brakujące zakresy dat

W przypadku, gdy twoje przedziały dat nie będą zagnieżdżone lub przecinające się, możesz użyć sztuczki z JOIN do wytworzenia zestawu wyników. Tak więc, aby wybrać żądany zestaw rekordów, potrzebujesz:

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;

co zaowocuje

+------------+------------+
| 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 |
+------------+------------+

(skrzypce bo to jest tutaj)

Aby "uzupełnić" tabelę, możesz użyć INSERT..SELECT składnia z SELECT zapytanie powyżej.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolejka instrukcji Insert MySQL

  2. W jaki sposób można zaprojektować prostą relacyjną relacyjną bazę danych nauczyciel-przedmiot-uczeń-wsadowy?

  3. Jak sprawdzić, czy tabela MySQL jest UTF-8 i ma storageEngine InnoDB?

  4. MySQL DATEDIFF() vs TIMESTAMPDIFF():Jaka jest różnica?

  5. Wstaw SQL do wybranych z wielu pól