Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटाबेस से लौटाई गई तिथियों में अंतराल भरना - शुद्ध एसक्यूएल समाधान संभव है?

हां, एक नंबर टेबल (एकल कॉलम एन) बनाना बेहतर है जिसमें 0 से 999 तक की संख्याएं शामिल हैं। इसका उपयोग कई चीजों के लिए किया जा सकता है, कम से कम नीचे की तरह एक क्वेरी नहीं:

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

आप गलत प्रारूप का उपयोग कर रहे हैं। यह अपर केस W सप्ताह के दिन के लिए कम नहीं है, इसलिए '%W %M %Y' या '%d %M %Y' महीने के दिन के लिए।http://dev.mysql.com/doc/refman/5.5/hi/date-and-time-functions.html#function_date-format

आप GROUP BY DAY(FROM_UNIXTIME(click_date)) का उपयोग कर रहे हैं नोट "दिन" कार्यदिवस नहीं, लेकिन आप "%W" . प्रदर्शित कर रहे हैं (या कोशिश कर रहे हैं) (सप्ताह का दिन) - एक चुनें, उन्हें मिलाएं नहीं।

संपादित करें: यदि आप एक नंबर अनुक्रम तालिका को अमल में लाना (वास्तविक तालिका के रूप में बनाना) नहीं चाहते हैं, तो आप मक्खी पर एक का निर्माण कर सकते हैं। यह सुंदर नहीं होगा।

नोट:नीचे दिए गए N1, N2 और N3 एक साथ मिलकर 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

#2 संपादित करें: एक सीधी तिथि तालिका

इसे phpMyAdmin में एक नई विंडो में रखें या इसे बैच के रूप में चलाएं। यह दिनांक 1900-01-01 . से प्रत्येक दिनांक के साथ दिनांक नाम की एक तालिका बनाता है (या स्क्रिप्ट में बदलाव) से 2300-01-01 (या बदलें)।

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;

ऐसी उपयोगिता तालिका के साथ, आपकी क्वेरी बस हो सकती है

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. कैसे लेनदेन निलंबन वसंत में काम करता है?

  2. Xampp:वेब ब्राउज़र लोकलहोस्ट पेज नहीं दिखाएगा

  3. जानबूझकर एक MySQL पंक्ति को कैसे लॉक करें जैसे कि चयन भी एक त्रुटि लौटाएगा?

  4. OSX पर रेल + MySQL:लाइब्रेरी लोड नहीं हुई:libmysqlclient.18.dylib

  5. फ्लास्क-स्क्लैल्केमी मिसिंग BEGIN सिंक सत्रों के कारण प्रतीत होता है