MySQL
Datum und Uhrzeit
Suche…
Jetzt()
Select Now();
Zeigt das aktuelle Datum und die Uhrzeit des Servers an.
Update `footable` set mydatefield = Now();
Dadurch wird das Feld mydatefield
mit dem aktuellen Datum und der Uhrzeit des Servers in der konfigurierten Zeitzone des Servers aktualisiert, z
'2016-07-21 12:00:00'
Datumsberechnung
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Zeigt die gespeicherten MySQL-Fragen an, die vor 3 bis 10 Stunden (vor 180 bis 600 Minuten) gestellt wurden:
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
MySQL-Handbuchseiten für TIMESTAMPDIFF()
.
Achtung Versuchen Sie nicht, Ausdrücke wie CURDATE() + 1
für die CURDATE() + 1
in MySQL zu verwenden. Sie geben nicht das zurück, was Sie erwarten, besonders wenn Sie an das Oracle-Datenbankprodukt gewöhnt sind. Verwenden CURDATE() + INTERVAL 1 DAY
stattdessen CURDATE() + INTERVAL 1 DAY
.
Testen gegen einen Datumsbereich
Obwohl es sehr verlockend ist, BETWEEN
... AND
... für einen Zeitraum zu verwenden, ist es problematisch. Stattdessen vermeidet dieses Muster die meisten Probleme:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
Vorteile:
-
BETWEEN
ist dabei inklusive, einschließlich des Enddatums oder des zweiten Datums. -
23:59:59
ist unbeholfen und falsch, wenn Sie eine Auflösung im Mikrosekundenbereich vonDATETIME
. - Dieses Muster vermeidet den Umgang mit Schaltjahren und anderen Datenberechnungen.
- Es funktioniert, ob
x
DATE
,DATETIME
oderTIMESTAMP
.
SYSDATE (), JETZT (), CURDATE ()
SELECT SYSDATE();
Diese Funktion gibt das aktuelle Datum und die aktuelle Uhrzeit als Wert im Format 'YYYY-MM-DD HH:MM:SS'
oder YYYYMMDDHHMMSS
, je nachdem, ob die Funktion in einem String oder einem numerischen Kontext verwendet wird. Es gibt Datum und Uhrzeit in der aktuellen Zeitzone zurück.
SELECT NOW();
Diese Funktion ist ein Synonym für SYSDATE()
.
SELECT CURDATE();
Diese Funktion gibt das aktuelle Datum ohne Zeit als Wert im Format 'YYYY-MM-DD'
oder YYYYMMDD
, je nachdem, ob die Funktion in einem String oder in einem numerischen Kontext verwendet wird. Es gibt das Datum in der aktuellen Zeitzone zurück.
Datum aus angegebenem Datum oder DateTime-Ausdruck extrahieren
SELECT DATE('2003-12-31 01:02:03');
Die Ausgabe wird sein:
2003-12-31
Verwenden eines Index für eine Datums- und Uhrzeitsuche
Viele reale Datenbanktabellen haben viele Zeilen mit DATETIME
TIMESTAMP
Spaltenwerten, die viel Zeit umfassen, einschließlich Jahren oder sogar Jahrzehnten. Häufig ist es erforderlich, eine WHERE
Klausel zu verwenden, um einen Teil dieser Zeitspanne abzurufen. Beispielsweise möchten wir Zeilen für das Datum 1. September 2016 aus einer Tabelle abrufen.
Ein ineffizienter Weg, dies zu tun, ist folgendes:
WHERE DATE(x) = '2016-09-01' /* slow! */
Es ist ineffizient, weil es eine Funktion - DATE()
- auf die Werte einer Spalte anwendet. Das bedeutet, MySQL muss jeden Wert von x
prüfen, und ein Index kann nicht verwendet werden.
Ein besserer Weg, um die Operation durchzuführen, ist dies
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Dieser wählt einen Wertebereich von x
einer beliebigen Stelle auf dem betreffenden Tag liegt, bis aber nicht einschließlich (daher <
) Mitternacht am nächsten Tag.
Wenn die Tabelle einen Index für die Spalte x
, kann der Datenbankserver eine Bereichsüberprüfung für den Index durchführen. Das heißt, es kann den ersten relevanten Wert von x schnell finden und dann den Index nacheinander durchsuchen, bis der letzte relevante Wert gefunden wird. Ein Indexbereichsscan ist wesentlich effizienter als der für DATE(x) = '2016-09-01
erforderliche vollständige Tabellenscan.
Seien Sie nicht versucht, dies zu verwenden, auch wenn es effizienter aussieht.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Es hat dieselbe Effizienz wie der Entfernungsscan, aber es werden Zeilen mit x
Werten ausgewählt, die genau um Mitternacht am 2. September 2016 fallen. Dies ist nicht das, was Sie wollen.