webentwicklung-frage-antwort-db.com.de

MySQL nur innerhalb des laufenden Monats?

Ich habe die folgende MySQL-Abfrage und versuche, sie so anzupassen, dass nur Ergebnisse abgerufen werden, die innerhalb des aktuellen Monats (des aktuellen Jahres) liegen. Vermutlich benötigen Sie weitere Informationen zu meiner MySQL-Struktur - Ich habe einen UNIX-Zeitstempel, der von PHPs time() generiert wurde und in der Spalte time (unter der Tabelle referrals) gespeichert ist. In der folgenden Konfiguration wäre dies also t2.time.

Mein Problem ist also, dass ich mir nicht sicher bin, wie ich vorgehen soll. Ich vermute, es wäre so etwas wie das Hinzufügen des Folgenden zum Ende der WHERE-Klausel? => AND t2.time IS WITHIN THE CURRENT MONTH (Großbuchstaben dienen nur zur Unterscheidung des Problems vom Rest der Abfrage) aber ich bin nicht sicher, wie ich überprüfen soll, ob es innerhalb des aktuellen Monats liegt.

Die MySQL-Abfrage:

SELECT t1.username,
       t1.website,
       SUM(IF(t2.type = 'in', 1, 0))  AS in_count,
       SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM   users AS t1
       JOIN referrals AS t2
         ON t1.username = t2.author
WHERE  t1.website != ''
GROUP  BY t1.username,
          t1.website
ORDER  BY in_count DESC 
LIMIT  0, 10 

Ich bedanke mich für jede Hilfe! : B

11
newbtophp

sie können from_unixtime like verwenden

date_format(from_unixtime(t2.`time`), '%Y-%m')=date_format(now(), '%Y-%m')

Ich denke jedoch, dass der Datentyp integer für diese Anforderung nicht geeignet ist

Ich würde mir vorstellen, dass die Verwendung von datetime besser geeignet ist. Erstellen Sie einen Index für diese Spalte und vereinfachen Sie so auch das Filtern

t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01'

oder

date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m')
14
ajreal

Sie müssen die Ergebnisse mit YEAR() und MONTH()functions einschränken. Ändern Sie den Teil WHERE Ihrer Abfrage wie folgt:

WHERE t1.website != ''
AND YEAR(time) = YEAR(NOW())
AND MONTH(time) = MONTH(NOW())
66
Anax
where t2.time >= extract(YEAR_MONTH from CURRENT_DATE) 
  and t2.time <  extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH)

Dies setzt voraus, dass t2.time ein datetime-Typ ist. Wenn es sich um einen ganzzahligen Unix-Zeitstempel handelt, können Sie die von uns erstellten oberen und unteren Datenzeitgrenzen mithilfe der Funktion UNIX_TIMESTAMP () konvertieren.

2
goat

Dies ist wahrscheinlich viel einfacher als Sie erwarten werden.

SELECT t1.username,
       t1.website,
       SUM(IF(t2.type = 'in', 1, 0))  AS in_count,
       SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM   users AS t1
       JOIN referrals AS t2
         ON t1.username = t2.author
WHERE  t1.website != ''
       AND t2.time >= DATE_SUB( CURRENT_DATE, INTERVAL 1 DAY )
GROUP  BY t1.username,
          t1.website
ORDER  BY in_count DESC 
LIMIT  0, 10 
2
Ryan Gooler

Um eine bessere Leistung zu erzielen (-> Verwenden Sie den Index), erstellen Sie einen Index für Ihre Datumsspalte und verwenden Sie ein "zwischen" in Ihrer where-Klausel.

select ... from my_table where my:date_field between concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01')
and adddate(concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01'), interval 1 month);
0
Cedric Simon