MySQL
Datum och tid
Sök…
Nu()
Select Now();
Visar aktuellt datum och tid på servern.
Update `footable` set mydatefield = Now();
Detta kommer att uppdatera fältet mydatefield
med aktuellt serverdatum och tid i serverens konfigurerade tidszon, t.ex.
'2016-07-21 12:00:00'
Datum aritmetik
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Visa lagrade mysql-frågor som ställdes för 3 till 10 timmar sedan (från 180 till 600 minuter sedan):
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 manuella sidor för TIMESTAMPDIFF()
.
Se upp Försök inte använda uttryck som CURDATE() + 1
för datum aritmetik i MySQL. De returnerar inte det du förväntar dig, särskilt om du är van vid Oracle-databasprodukten. Använd CURDATE() + INTERVAL 1 DAY
istället.
Testar mot ett datumintervall
Även om det är mycket frestande att använda BETWEEN
... AND
... för ett datumintervall är det problematiskt. Istället undviker detta mönster de flesta problem:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
fördelar:
-
BETWEEN
är "inkluderande" och inkluderar därmed sista datum eller andra. -
23:59:59
är klumpig och fel om du har mikrosekundupplösning påDATETIME
. - Detta mönster undviker att hantera skottår och andra beräkningar av data.
- Det fungerar om
x
ärDATE
,DATETIME
ellerTIMESTAMP
.
SYSDATE (), NU (), CURDATE ()
SELECT SYSDATE();
Denna funktion returnerar aktuellt datum och tid som ett värde i 'YYYY-MM-DD HH:MM:SS'
eller YYYYMMDDHHMMSS
format, beroende på om funktionen används i en sträng eller numeriskt sammanhang. Det returnerar datum och tid i den aktuella tidszonen.
SELECT NOW();
Denna funktion är en synonym för SYSDATE()
.
SELECT CURDATE();
Denna funktion returnerar det aktuella datumet utan någon tid som ett värde i 'YYYY-MM-DD'
eller YYYYMMDD
format, beroende på om funktionen används i en sträng eller numeriskt sammanhang. Det returnerar datumet i den aktuella tidszonen.
Extrahera datum från givet datum eller datumtiduttryck
SELECT DATE('2003-12-31 01:02:03');
Utgången kommer att vara:
2003-12-31
Använda ett index för en datum- och tidsuppslag
Många verkliga databastabeller har många rader med DATETIME
eller TIMESTAMP
spänner över mycket tid, inklusive år eller till och med decennier. Ofta är det nödvändigt att använda en WHERE
klausul för att hämta en delmängd av den tidsperioden. Till exempel kanske vi vill hämta rader för datumet 1 september 2016 från en tabell.
Ett ineffektivt sätt att göra det är detta:
WHERE DATE(x) = '2016-09-01' /* slow! */
Det är ineffektivt eftersom det tillämpar en funktion - DATE()
- för värdena i en kolumn. Det betyder att MySQL måste undersöka varje värde på x
, och att ett index inte kan användas.
Ett bättre sätt att utföra operationen är detta
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Detta väljer ett antal värden på x
ligger någonstans på den aktuella dagen, fram till men inte inkluderar (därmed <
) midnatt nästa dag.
Om tabellen har ett index i x
kolumnen, kan databasservern utföra en avstandsskanning på indexet. Det betyder att den snabbt kan hitta det första relevanta värdet på x och sedan skanna indexet i tur och ordning tills det hittar det senaste relevanta värdet. En indexintervallskanning är mycket effektivare än den fullständiga tabellscanningen som krävs enligt DATE(x) = '2016-09-01
.
Frestas inte att använda detta, även om det ser mer effektivt ut.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Den har samma effektivitet som områdescanningen, men den kommer att välja rader med värden på x
faller exakt vid midnatt den 2 september 2016, vilket inte är vad du vill ha.