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

Cách tìm tất cả các giá trị dấu thời gian theo từng phút giữa hai bản ghi dấu thời gian trong cơ sở dữ liệu sql của tôi

Với sự trợ giúp của https://stackoverflow.com/a/45992247/7616138 để tạo một chuỗi trong MySQL, tôi fiddled xung quanh để sản xuất cái này:

Giả sử bảng của bạn được gọi là entries , truy vấn sau đây tạo ra kết quả mà bạn yêu cầu. Xin lưu ý rằng truy vấn này không hiệu quả lắm vì nó sử dụng kết hợp chéo để tạo chuỗi phút. Nếu khoảng thời gian của bạn lớn hơn, bạn có thể cần phải kéo dài các phép nối chéo.

SELECT 
    a.*, 
    DATE_ADD(DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND), INTERVAL gen_time MINUTE) AS gen_date_time
FROM 
    entries AS a
    LEFT JOIN
        (
            SELECT
                m3 * 1000 + m2 * 100 + m1 * 10 + m0 AS gen_time
            FROM
                (SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m0,
                (SELECT 0 m1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m1,
                (SELECT 0 m2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m2,
                (SELECT 0 m3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m3
            ORDER BY
                gen_time asc
        ) AS b ON (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date)
ORDER BY
    a.id,
    gen_date_time

Giải thích:

Mỗi dòng như SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 tạo ra các số từ 0 đến 9. Việc kết hợp chéo một số dòng này với nhau sẽ tạo ra mọi sự kết hợp có thể có của các số này. Chúng tôi sử dụng mỗi dòng để tạo ra một chữ số cụ thể của số phút để thêm vào open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Chuỗi số phút này được kết hợp với bảng mục nhập chỉ bằng số phút phù hợp với khoảng thời gian (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). Trong SELECT open_date được làm tròn đến phút (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) và số phút được thêm vào (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Lược đồ giả định và dữ liệu mẫu:

CREATE TABLE entries (
  id INT AUTO_INCREMENT PRIMARY KEY,
  open_date TIMESTAMP,
  close_date TIMESTAMP
);

INSERT INTO entries (open_date, close_date) VALUES
  ("2019-07-03 16:28:39.497", "2019-07-04 16:28:39.497"),
  ("2019-07-04 15:28:39.497", "2019-07-05 19:28:39.497");



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Số thứ tự được tạo tự động bắt đầu từ 001 (CHỈ DÀNH CHO 3 SỐ) - PHP / MYSQL

  2. chèn dữ liệu vào MYSQL bằng mảng PHP

  3. vấn đề so sánh ngày giờ varchar

  4. Doctrine2.3 và OneToOne thác vẫn tồn tại dường như không hoạt động

  5. Muối PHP và băm SHA256 cho mật khẩu đăng nhập