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

Mengisi Kesenjangan dalam Tanggal yang Dikembalikan dari Database - solusi SQL murni mungkin?

Ya, lebih baik membuat tabel Numbers (kolom tunggal N) yang hanya berisi angka 0 hingga 999. Dapat digunakan untuk banyak hal, paling tidak query seperti di bawah ini:

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

Anda menggunakan format yang salah. Ini huruf UPPER W tidak lebih rendah untuk hari dalam seminggu, jadi '%W %M %Y' atau '%d %M %Y' untuk hari-bulan.http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

Anda menggunakan GROUP BY DAY(FROM_UNIXTIME(click_date)) catat "hari" bukan hari kerja, tetapi Anda menampilkan (atau mencoba) "%W" (hari kerja) - pilih salah satu, jangan campur.

EDIT: Jika Anda memilih untuk tidak mewujudkan (membuat sebagai tabel nyata) tabel urutan Angka, Anda dapat membuatnya dengan cepat. Itu tidak akan cantik.

Catatan:N1, N2 dan N3 di bawah ini digabungkan untuk memberikan kemungkinan kisaran 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

EDIT #2: Tabel Tanggal langsung

Letakkan ini di jendela baru di phpMyAdmin atau jalankan sebagai batch. Itu membuat tabel bernama Tanggal, dengan setiap tanggal dari hari 1900-01-01 (atau ubah scriptnya) menjadi 2300-01-01 (atau ubah).

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;

Dengan tabel utilitas seperti itu, kueri Anda bisa saja

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. Bergabung dengan dua tabel serupa di MySQL

  2. Desain basis data untuk aplikasi menggunakan tagar

  3. Fungsi MySQL LN() – Mengembalikan Logaritma Natural dari suatu Angka

  4. Tidak dapat menghasilkan perbedaan dari plugin liquibase gradle

  5. mysql fulltext MATCH, MELAWAN mengembalikan 0 hasil