2017-12-22 6 views
1

Ich benutze PHP, um auf eine MySQL-Datenbank zuzugreifen. Ich habe eine Tabelle wie folgt aufgebaut:MySQL-Filter für bestimmte Daten, wenn Daten gerade als UNIX-Zeitstempel gespeichert werden

Tabelle Header:

  • id (INT, Autoinkrement), das Profil, Zeitstempel

Tabelleninhalt:

  • 1, 12345678, 1513814399 (= 12/21/2017)
  • 2, 13451983, 1513814400 (= 12/21/2017)
  • 3, 12345678, 1513944000 (= 12/22/2017)
  • 4, 12345678, 1513944001 (= 12/22/2017)

Die Tabelle zeigt, welche profileids wurden von einem Website-Besucher genannt worden, bei denen Zeit.

Also meine Frage ist jetzt, wie ist es möglich, zum Beispiel zu zeigen: "Geben Sie mir die Anzahl der Einträge für Profil Nr. 12345678 aufgerufen am 22.12.2017", die in diesem Fall "2" wäre .

Ich versuchte es mit dieser Abfrage:

SELECT COUNT(profileid), from_unixtime(timestamp, '%d') AS day, from_unixtime(timestamp, '%m') as month, from_unixtime(timestamp, '%Y') as year WHERE profileid='12345678' AND day=22 AND month=12 AND year=2017; 

Aber es ist nicht möglich, die Spalten „Tag“ zugreifen zu können, „Monat“ und „Jahr“, weil sie in der Tabelle nicht existieren.

Kann mir jemand einen Tipp geben, wie man das macht? Ein anderer Weg wäre, drei neue Spalten zu erstellen (timestamp_day, timestamp_month und timestamp_year), aber das ist keine nette Lösung.

Vielen Dank im Voraus!

teha

+0

Welchen Datentyp hat das "timestamp" -Feld? Warum nicht direkt als "Datum" einstellen? Es scheint unnötig, es in einem Format zu speichern, in dem die Konvertierung so verwendet werden muss, wie Sie es möchten. –

+0

MySQL hat Datumsfunktionen wie 'DAY()', 'MONTH()' und 'YEAR() usw., die Sie auf Ihr Datumsfeld anwenden können. Siehe: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html –

+0

Vielen Dank für Ihre Kommentare. Es hat den Typ Integer. Ich mache das so, weil ich daran gewöhnt bin, um ehrlich zu sein, und es ist schön, Zeitunterschiede zu berechnen. – teha

Antwort

3

Nur das Datum zu produzieren. Ich glaube, Sie wollen:

SELECT COUNT(profileid) 
FROM t 
WHERE DATE(from_unixtime(timestamp)) = '2017-12-22' AND 
     profileid = '12345678'; 

Ich würde eher geneigt sein, dies zu schreiben, wie:

SELECT COUNT(profileid) 
FROM t 
WHERE profileid = '12345678' AND 
     timestamp >= UNIX_TIMESTAMP('2017-12-22') AND 
     timestamp < UNIX_TIMETAMP('2017-12-23'); 

Dies ermöglicht die Abfrage der volle Verwendung eines Index auf t(profileid, timestamp) zu machen.

+0

Das sieht gut aus. Wusste nicht, dass es so möglich ist. Ich werde es testen und Feedback geben! – teha

0

Sie können die MySQL-Funktionen DAY, MONTH und YEAR Funktionen kombiniert mit FROM_UNIXTIME verwenden.

SELECT COUNT(profileid) 
WHERE profileid='12345678' 
AND DAY(FROM_UNIXTIME(timestamp))=22 
AND MONTH(FROM_UNIXTIME(timestamp))=12 
AND YEAR(FROM_UNIXTIME(timestamp))=2017; 
0

Ein paar Dinge hier.

  1. Sie können Ihren RAW-Zeitstempel auf ein MySQL TIMESTAMP Objekt mit FROM_UNIXTIME(timestamp) konvertieren. Das weißt du bereits.
  2. Sobald Sie eine TIMESTAMP haben, können Sie alle Arten von Datumsfunktionen darauf verwenden.
  3. Sie können die andere Richtung mit UNIX_TIMESTAMP() konvertieren
  4. Wenn Sie Datensätze für einen Tag nachschlagen, können Sie Datumsbereich suchen.

So Ihre Abfrage sollte vielleicht

SELECT COUNT(*) cnt 
    FROM t 
    WHERE profileid = '12345678' 
     AND timestamp >= UNIX_TIMESTAMP('2017-12-22') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-23') 

sein, dass jeder Zeitmarkenwert am Tag abholen Sie wollen, bis zu, aber nicht Mitternacht am nächsten Tag inklusive. Wenn Sie einen Index auf (profileid, timestamp) haben, wird diese Art der Abfrage schnell sein.

Hinweis Sie tun können, auch

SELECT COUNT(*) cnt, profileid 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-12-22') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-23') 
    GROUP BY profileid 

und eine Ergebnismenge erhalten die Zählungen für alle Profil-IDs für diesen Tag zeigt. Und Sie können

SELECT COUNT(*) cnt, profileid, DATE(FROM_UNIXTIME(timestamp)) day 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-11-01') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-01') 
    GROUP BY profileid, DATE(FROM_UNIXTIME(timestamp)) 

tun und alles für den November bekommen.

können Sie dies

SELECT COUNT(*) cnt, profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) month_ending 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-01-01') 
     AND timestamp < UNIX_TIMESTAMP('2018-01-01') 
    GROUP BY profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) 

und einen Monat-für-Monat Zusammenfassung für ein ganzes Jahr.

Datumsarithmetik ist nützlich. Aus diesem Grund verwenden viele Tabellenentwürfe tatsächliche datumsstempelähnliche Felder wie und TIMESTAMP statt roher Ganzzahl-Zeitstempel.

Verwandte Themen