Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mysql Temukan rentang tanggal yang hilang

Jika interval tanggal Anda tidak bersarang atau berpotongan, Anda dapat menggunakan trik dengan JOIN untuk menghasilkan set hasil. Jadi, untuk memilih kumpulan rekaman yang diinginkan, Anda memerlukan:

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;

yang akan menghasilkan

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

(biola untuk ini di sini)

Untuk "menyelesaikan" tabel Anda, Anda dapat menggunakan INSERT..SELECT sintaks dengan SELECT kueri di atas.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cari lokasi terdekat dengan Zip/Postal Code?

  2. Menetapkan output kueri BQ ke variabel

  3. Bagaimana cara memeriksa apakah suatu variabel NULL, lalu mengaturnya dengan prosedur tersimpan MySQL?

  4. PILIH id MEMILIKI jumlah maksimum id

  5. Grup MySQL berdasarkan penampilan berturut-turut