Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mysql Tìm phạm vi ngày bị thiếu

Trong trường hợp nếu các khoảng thời gian ngày của bạn không được lồng vào nhau hoặc giao nhau, bạn có thể sử dụng thủ thuật với JOIN để tạo ra tập hợp kết quả. Vì vậy, để chọn tập hợp bản ghi mong muốn, bạn sẽ cần:

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;

điều đó sẽ dẫn đến

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

( fiddle vì đây là đây)

Để "hoàn thành" bảng của mình, bạn có thể sử dụng INSERT..SELECT cú pháp với SELECT truy vấn ở trên.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách theo dõi các chỉ số HAProxy với ClusterControl

  2. Truy vấn MySQL với số lượng và nhóm theo

  3. MySqlConnection =MySqlConnection mới (chuỗi) không hoạt động

  4. CẬP NHẬT tất cả các giá trị cột tương đương với một giá trị cột của bảng khác dựa trên id của chúng

  5. Sử dụng FullCalendar không có ngày tháng