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

Lấp khoảng trống trong ngày Trả về từ Cơ sở dữ liệu - giải pháp SQL thuần túy có được không?

Có, tốt hơn là tạo một bảng Numbers (một cột N) không chứa gì ngoài các số từ 0 đến 999. Nó có thể được sử dụng cho nhiều thứ, không nhất là một truy vấn như bên dưới:

SELECT COUNT(t.click_date) as clicks,
    DATE_FORMAT(adddate($start_date, interval N day), '%d %M %Y') as point 
FROM Numbers
LEFT JOIN tracking t
    ON t.click_date >= adddate($start_date, interval N day)
    and t.click_date < adddate($start_date, interval (N+1) day)
WHERE N between 0 and datediff($start_date, $end_date)
GROUP BY N

Bạn đang sử dụng sai định dạng. Trường hợp UPPER W không thấp hơn cho các ngày trong tuần, vì vậy '% W% M% Y' hoặc '% d% M% Y' cho ngày trong tháng. http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html# Chức năng_date-format

Bạn đang sử dụng GROUP BY DAY(FROM_UNIXTIME(click_date)) ghi chú "ngày" không phải ngày thường, nhưng bạn đang hiển thị (hoặc cố gắng) "% W" (ngày trong tuần) - chọn một, không trộn chúng.

CHỈNH SỬA: Nếu bạn không muốn hiện thực hóa (tạo như một bảng thực) một bảng chuỗi Numbers, bạn có thể tạo một bảng chuỗi số một cách nhanh chóng. Nó sẽ không được đẹp.

Lưu ý:N1, N2 và N3 dưới đây kết hợp với nhau để cho ra một phạm vi có thể là 0-999

SELECT COUNT(t.click_date) as clicks,
    DATE_FORMAT(adddate($start_date, interval N day), '%d %M %Y') as point 
FROM (
    select N1 * 100 + N2 * 10 + N3 as N
    from (
    select 0 N1 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) N1
    cross join (
    select 0 N2 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) N2
    cross join (
    select 0 N3 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) N3
    ) Numbers
LEFT JOIN tracking t
    ON t.click_date >= adddate($start_date, interval N day)
    and t.click_date < adddate($start_date, interval (N+1) day)
WHERE N between 0 and datediff($start_date, $end_date)
GROUP BY N

CHỈNH SỬA # 2: Bảng Ngày tháng thẳng

Đặt nó vào một cửa sổ mới trong phpMyAdmin hoặc chạy nó theo lô. Nó tạo một bảng có tên là Ngày, với mỗi ngày từ ngày 1900-01-01 (hoặc thay đổi tập lệnh) thành 2300-01-01 (hoặc thay đổi).

DROP PROCEDURE IF EXISTS FillDateTable;

delimiter //
CREATE PROCEDURE FillDateTable()
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
  drop table if exists datetable;
  create table datetable (thedate datetime primary key, isweekday smallint);

  SET @x := date('1900-01-01');
  REPEAT 
    insert into datetable (thedate, isweekday) SELECT @x, case when dayofweek(@x) in (1,7) then 0 else 1 end;
    SET @x := date_add(@x, interval 1 day);
    UNTIL @x > date('2300-01-01') END REPEAT;
END//
delimiter ;

CALL FillDateTable;

Với một bảng tiện ích như vậy, truy vấn của bạn có thể chỉ

SELECT COUNT(t.click_date) as clicks,
    DATE_FORMAT(thedate, '%d %M %Y') as point 
FROM Dates
LEFT JOIN tracking t
    ON t.click_date >= thedate
    and t.click_date < adddate(thedate, interval 1 day)
WHERE thedate between $start_date and $end_date
GROUP BY thedate


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị dữ liệu dựa trên id đã chọn trên cửa sổ bật lên phương thức sau khi nhấp vào nút php mysql

  2. MySQL CHAR () so với T-SQL CHAR ():Sự khác biệt là gì?

  3. LỖI trong PDO:Cuộc gọi đến một hàm thành viên chuẩn bị () trên null

  4. Làm cách nào để cài đặt MySQLdb (thư viện truy cập dữ liệu Python vào MySQL) trên Mac OS X?

  5. MySQL COALESCE () Giải thích