Wie Runde ein DateTime in MySQL?
Möchte ich die Diskretisierung der Zeit mit der Auflösung von 5 Minuten. Ich habe es in C#, aber wie konvertieren Sie den folgenden code, um die MySQL?
DateTime Floor(DateTime dateTime, TimeSpan resolution)
{
return new DateTime
(
timeSpan.Ticks *
(long) Math.Floor
(
((double)dateTime.Ticks) /
((double)resolution.Ticks)
)
);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein wenig böse, wenn man es mit datetime-Datentypen; ein schönes Kandidat für eine gespeicherte Funktion.
Es ist einfacher, wenn Sie verwenden UNIXTIME-Zeitstempel, aber das ist beschränkt auf ein 1970 - 2038 Datumsbereich.
Glück.
select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00') - MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));
Können Sie schauen Sie hier. Dieses Beispiel ist ein allgemeiner Fall für die Rundung auf die nächsten X Minuten, und ist in T-SQL geschriebenen, aber die Logik und die Mehrheit der Funktionen werden die gleichen in beiden Fällen.
können Sie ersetzen die zwei 5s mit anderen Werten
from_unixtime(floor(unix_timestamp('2012-03-11 2:14:00')/(60*5))*(60*5))
Haben Sie schon einen Blick auf die CAST-Funktionen in MySQL?
Hier ist eine weitere Variante, basierend auf einer Lösung aus diesem thread.
Diese Lösung, im Gegensatz zu diejenigen, die
FROM_UNIXTIME
geben den erwarteten Wert für die datetimes, die fallen in die Sommerzeit (DST) übergänge. (Vergleichen Sie zum Beispiel 2012-11-03 2:14:00)Bearbeiten - Nach einigen schnellen benchmarking jedoch, Ollie ' s erste Lösung erscheint, führen Sie schneller als dieser. Ich empfehle aber trotzdem, gegen die FROM_UNIXTIME Methode.
Andere alternative:
um die nächsten Stunde:
Statt
CURDATE()
Sie können einen beliebigen Zeitpunkt, zum Beispiel'2000-01-01'
Nicht sicher, ob es Probleme geben könnte mit
CURDATE()
wenn das system Datum wechselt zwischen den zwei Aufrufe der Funktion, weiß nicht, ob Mysql nennen würde beide zur gleichen Zeit.ändern 60 von 15 würde sich die nächsten 15 Minuten Intervall, mit der ZWEITEN können Sie die nächste gewünschte zweite Intervall, etc.
Zu Holen Sie sich die letzten Stunden Nutzung
TRUNCATE()
oderFLOOR()
stattROUND()
.Hoffe, das hilft.