Truy vấn số lượng bản ghi hàng ngày trong MySQL với khoảng thời gian cụ thể hoặc ngày trước

Bài viết này sẽ trình bày cách sử dụng SQL để truy vấn số lượng bản ghi mỗi ngày trong một khoảng thời gian nhất định hoặc số ngày trước đó. Các giá trị không tồn tại sẽ được điền bằng 0.

hoat_dong_kinh_doanh: Tên bảng kinh doanh.
thoi_gian_tao: Trường thời gian trong bảng kinh doanh, dùng để thống kê số lượng.
ngay: Biến đại diện cho ngày thống kê (có thể thay đổi tên).
so_luong: Biến đại diện cho kết quả số lượng (có thể thay đổi tên).

bảng_thoigian: Bảng chứa tất cả các ngày phù hợp điều kiện.
bảng_kinhdoanh: Bảng kinh doanh đã nhóm theo ngày và đếm số lượng bản ghi mỗi ngày.
Cuối cùng, chúng ta sử dụng phép nối trái (LEFT JOIN) để ghép hai bảng và trả về kết quả cuối cùng.
  • Truy vấn số ngày trước
SELECT b.ngay, IFNULL(a.so_luong, 0) AS so_luong FROM (
    SELECT DATE_SUB(CURDATE(), INTERVAL s.so_ngay DAY) AS ngay
    FROM (
        SELECT 0 AS so_ngay UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
        UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
    ) s
    WHERE DATE_SUB(CURDATE(), INTERVAL s.so_ngay DAY) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
) b
LEFT JOIN (
    SELECT COUNT(*) AS so_luong, DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d') AS ngay
    FROM hoat_dong_kinh_doanh
    GROUP BY DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d')
) a ON b.ngay = a.ngay
ORDER BY b.ngay;

Kết quả: Truy vấn số lượng bản ghi mỗi ngày từ hôm nay đến 7 ngày trước.

  • Truy vấn trong một khoảng thời gian
SELECT b.ngay, IFNULL(a.so_luong, 0) AS so_luong FROM (
    SELECT DATE_FORMAT('2024-03-31', '%Y-%m-%d') - INTERVAL s.so_ngay DAY AS ngay
    FROM (
        SELECT 0 AS so_ngay UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
        UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 
        UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 
        UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
        UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 
        UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL SELECT 29 
        UNION ALL SELECT 30
    ) s
    GROUP BY ngay HAVING ngay BETWEEN '2024-03-01' AND '2024-03-31'
) b
LEFT JOIN (
    SELECT COUNT(*) AS so_luong, DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d') AS ngay
    FROM hoat_dong_kinh_doanh
    GROUP BY DATE_FORMAT(thoi_gian_tao, '%Y-%m-%d')
) a ON b.ngay = a.ngay
ORDER BY b.ngay;

Kết quả: Truy vấn số lượng bản ghi mỗi ngày từ ngày 2024-03-01 đến 2024-03-31.

Thẻ: mysql sql Datetime

Đăng vào ngày 22 tháng 5 lúc 07:02