MySQL
Datum- en tijdbewerkingen
Zoeken…
Nu()
Select Now();
Toont de huidige serverdatum en -tijd.
Update `footable` set mydatefield = Now();
Dit zal het veld mydatefield
met de huidige serverdatum en -tijd in de geconfigureerde tijdzone van de server, bijv
'2016-07-21 12:00:00'
Datum rekenen
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Toon de opgeslagen MySQL-vragen die 3 tot 10 uur geleden zijn gesteld (180 tot 600 minuten geleden):
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-hulppagina's voor TIMESTAMPDIFF()
.
Pas op Probeer geen uitdrukkingen zoals CURDATE() + 1
voor rekenkundige datum in MySQL. Ze geven niet terug wat u verwacht, vooral als u gewend bent aan het Oracle-databaseproduct. Gebruik in plaats daarvan CURDATE() + INTERVAL 1 DAY
.
Testen tegen een datumbereik
Hoewel het erg verleidelijk is om BETWEEN
... AND
... voor een periode te gebruiken, is het problematisch. In plaats daarvan vermijdt dit patroon de meeste problemen:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
voordelen:
-
BETWEEN
is 'inclusief', inclusief de laatste datum of seconde. -
23:59:59
is onhandig en fout als je een microsecondenresolutie hebt op eenDATETIME
. - Dit patroon voorkomt het omgaan met schrikkeljaren en andere gegevensberekeningen.
- Het werkt of
x
DATE
,DATETIME
ofTIMESTAMP
.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
Deze functie retourneert de huidige datum en tijd als een waarde in 'YYYY-MM-DD HH:MM:SS'
indeling 'YYYY-MM-DD HH:MM:SS'
of YYYYMMDDHHMMSS
, afhankelijk van of de functie wordt gebruikt in een string of numerieke context. Het retourneert de datum en tijd in de huidige tijdzone.
SELECT NOW();
Deze functie is een synoniem voor SYSDATE()
.
SELECT CURDATE();
Deze functie retourneert de huidige datum, zonder enige tijd, als een waarde in de indeling 'YYYY-MM-DD'
of YYYYMMDD
, afhankelijk van het feit of de functie in een string of numerieke context wordt gebruikt. Het retourneert de datum in de huidige tijdzone.
Datum extraheren van gegeven datum of datum / tijd-expressie
SELECT DATE('2003-12-31 01:02:03');
De output zal zijn:
2003-12-31
Een index gebruiken voor het opzoeken van datum en tijd
Veel DATETIME
-tabellen hebben veel rijen met DATETIME
OF TIMESTAMP
kolomwaarden die veel tijd omvatten, inclusief jaren of zelfs decennia. Vaak is het nodig om een WHERE
component te gebruiken om een subset van die tijdspanne op te halen. We kunnen bijvoorbeeld rijen voor de datum 1-september-2016 uit een tabel ophalen.
Een inefficiënte manier om dit te doen is dit:
WHERE DATE(x) = '2016-09-01' /* slow! */
Het is inefficiënt omdat het een functie - DATE()
- toepast op de waarden van een kolom. Dat betekent dat MySQL elke waarde van x
moet onderzoeken en dat een index niet kan worden gebruikt.
Een betere manier om de operatie uit te voeren is dit
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Hiermee selecteert u een bereik van x
dat ergens op de betreffende dag ligt, tot maar niet (vandaar <
) middernacht op de volgende dag.
Als de tabel een index op de x
kolom heeft, kan de databaseserver een bereikscan op de index uitvoeren. Dat betekent dat het snel de eerste relevante waarde van x kan vinden en vervolgens de index opeenvolgend kan scannen totdat het de laatste relevante waarde vindt. Een indexbereikscan is veel efficiënter dan de volledige tabelscan die vereist is op DATE(x) = '2016-09-01
.
Laat je niet verleiden om dit te gebruiken, ook al ziet het er efficiënter uit.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Het heeft dezelfde efficiëntie als de bereikscan, maar het zal rijen selecteren met waarden van x
die precies om middernacht op 2-sept-2016 vallen, wat niet is wat u wilt.