2016-07-12 8 views
0

Ich versuche, eine Abfrage aus, diese zu verwenden SO Check for x consecutive days - given timestamps in database Frage ein Benutzer eine Anzahl von aufeinander folgenden Tagen zu rechnen hat eine Aktivität, dh 3 Tage vorgelegt, 5 Tage, 7 Tage usw.Erhalten Sie 3 aufeinanderfolgende Tage von MySQL-Daten

die Abfrage ist:

SELECT IF(COUNT(1) > 0, 1, 0) AS has_consec 
FROM 
(
SELECT * 
FROM 
(
    SELECT IF(b.dateAdded IS NULL, @val:[email protected]+1, @val) AS consec_set 
    FROM activity a 
    CROSS JOIN (SELECT @val:=0) var_init 
    LEFT JOIN activity b ON 
     a.userID = b.userID AND 
     a.dateAdded = b.dateAdded + INTERVAL 1 DAY 
    WHERE a.userID = 1 
) a 
GROUP BY a.consec_set 
HAVING COUNT(1) >= 3 
) a 

der Code funktioniert gut, wenn das Datumsfeld nicht Datums- und Uhrzeit ist aber wie würde ich den Code ändern, die Zeitkomponente von Datums- und Uhrzeit zu ignorieren? Ich habe versucht, DATE (dateAdded) zu verwenden, aber das hat nicht funktioniert.

Meine Daten wie folgt aussieht:

userID dateAdded 
1  2016-07-01 17:01:56 
1  2016-07-02 12:45:49 
1  2016-07-03 13:06:27 
1  2016-07-04 12:51:10 
1  2016-07-05 15:51:10 
2  2016-07-06 16:51:10 
2  2016-07-07 11:51:10 
1  2016-07-08 11:26:38 

Dank

+0

dieses http Versuchen: //www.tutorialspoint.com/mysql/mysql-date-time-functions.htm#function_timestampadd –

+0

Versuchen Sie, Ihre Datum Uhrzeit Feld auf dieses Datum wie folgt zu 'DATUM (a.dateAdded)' – 1000111

+0

Versucht, dass und es hat nicht funktioniert. Wenn ich die Zeitkomponente ändere, um die gleiche zu sein, funktioniert die Abfrage, aber sogar das Gießen auf DATE lieferte nicht die korrekten Ergebnisse. – puks1978

Antwort

0

Casted das dateAdded Feld Date.

Bitte versuchen Sie es und lassen Sie mich wissen, ob es das Problem behebt:

SELECT IF(COUNT(1) > 0, 1, 0) AS has_consec 
FROM 
(
SELECT * 
FROM 
(
    SELECT IF(b.dateAdded IS NULL, @val:[email protected]+1, @val) AS consec_set 
    FROM activity a 
    CROSS JOIN (SELECT @val:=0) var_init 
    LEFT JOIN activity b ON 
     a.userID = b.userID AND 
     DATE(a.dateAdded) = DATE(b.dateAdded) + INTERVAL 1 DAY 
    WHERE a.userID = 1 
) a 
GROUP BY a.consec_set 
HAVING COUNT(1) >= 3 
) a; 

Hinweis:timestamp Mit nur korrekte Ausgabe zurück, wenn sie gleich sind mit time (hh:mm:ss)

Verwandte Themen