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

Potrzebujesz tablicy bloków danych z bazy danych MySql

Spójrz na poniższy diagram, który przedstawia niektóre nakładające się okresy

X----|              |--------|         |------X
    |-------X      X------------X
                         |----|     X----|

Początek lub koniec dowolnego ciągłego okresu czasu, oznaczony X nie mieści się w żadnym innym okresie. Jeśli zidentyfikujemy te czasy, możemy poczynić pewne postępy.

To zapytanie określa granice.

SELECT boundary FROM
(

-- find all the lower bounds
    SELECT d1.StartDate AS boundary, 'lower' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.StartDate > d2.StartDate
        AND 
        d1.StartDate < d2.EndDate
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate

UNION

-- find all the upper bounds
    SELECT d1.EndDate AS boundary, 'upper' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.EndDate > d2.StartDate
        AND 
        d1.EndDate < d2.EndDate 
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate
) as boundaries

ORDER BY boundary ASC

Wynikiem tego zapytania dotyczącego Twoich danych jest

boundry    | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper

Zakresy dat, których szukasz, mieszczą się między kolejnymi dolnymi i górnymi granicami pokazanymi powyżej. Przy odrobinie przetwarzania końcowego można je łatwo znaleźć.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie strtotime dla dat sprzed 1970

  2. PDO::bindParam w pętli foreach, czy wszystkie wartości są takie same?

  3. Różnice w ciągach PHP i ograniczenia dynamiczne

  4. skopiować strukturę bazy danych bez danych w mysql (z pustymi tabelami)

  5. błąd krytyczny mysql.h:Brak takiego pliku lub katalogu podczas kompilacji