MySQL
Operazioni di data e ora
Ricerca…
Adesso()
Select Now();
Mostra la data e l'ora del server corrente.
Update `footable` set mydatefield = Now();
Questo aggiornerà il campo mydatefield
con la data e l'ora del server corrente nel fuso orario configurato del server, ad es
'2016-07-21 12:00:00'
Data aritmetica
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Mostra le domande mysql memorizzate che sono state poste da 3 a 10 ore fa (da 180 a 600 minuti fa):
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 |
| ... | | |
+----------+---------------------+------------+
Pagine di manuale MySQL per TIMESTAMPDIFF()
.
Attenzione Non cercare di usare espressioni come CURDATE() + 1
per l'aritmetica della data in MySQL. Non restituiscono ciò che ti aspetti, soprattutto se sei abituato al prodotto del database Oracle. Utilizzare invece CURDATE() + INTERVAL 1 DAY
.
Test contro un intervallo di date
Anche se è molto allettante usare BETWEEN
... AND
... per un intervallo di date, è problematico. Invece, questo schema evita la maggior parte dei problemi:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
vantaggi:
-
BETWEEN
è "incluso" quindi includendo la data finale o il secondo. -
23:59:59
è maldestro e sbagliato se hai una risoluzione di microsecondi suDATETIME
. - Questo modello evita di gestire gli anni bisestili e altri calcoli di dati.
- Funziona se
x
èDATE
,DATETIME
oTIMESTAMP
.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
Questa funzione restituisce la data e l'ora correnti come valore nel formato 'YYYY-MM-DD HH:MM:SS'
o YYYYMMDDHHMMSS
, a seconda che la funzione venga utilizzata in una stringa o in un contesto numerico. Restituisce la data e l'ora nel fuso orario corrente.
SELECT NOW();
Questa funzione è un sinonimo di SYSDATE()
.
SELECT CURDATE();
Questa funzione restituisce la data corrente, senza alcun orario, come valore nel formato 'YYYY-MM-DD'
o YYYYMMDD
, a seconda che la funzione venga utilizzata in una stringa o in un contesto numerico. Restituisce la data nel fuso orario corrente.
Data di estrazione dalla data data o dall'espressione data / ora
SELECT DATE('2003-12-31 01:02:03');
L'output sarà:
2003-12-31
Utilizzando un indice per una ricerca di data e ora
Molte tabelle di database reali hanno molte righe con valori di colonna DATETIME
OR TIMESTAMP
che coprono molto tempo, inclusi anni o addirittura decenni. Spesso è necessario utilizzare una clausola WHERE
per recuperare alcuni sottoinsiemi di quel periodo di tempo. Ad esempio, potremmo voler recuperare le righe per la data 1 settembre 2016 da una tabella.
Un modo inefficiente per farlo è questo:
WHERE DATE(x) = '2016-09-01' /* slow! */
È inefficiente perché applica una funzione, DATE()
, ai valori di una colonna. Ciò significa che MySQL deve esaminare ciascun valore di x
e non è possibile utilizzare un indice.
Questo è un modo migliore di fare l'operazione
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Questo seleziona un intervallo di valori di x
giace in qualsiasi punto del giorno in questione, fino a ma non compreso (quindi <
) a mezzanotte del giorno successivo.
Se la tabella ha un indice sulla colonna x
, il server di database può eseguire una scansione di intervallo sull'indice. Ciò significa che può trovare rapidamente il primo valore rilevante di x, quindi eseguire la scansione dell'indice in modo sequenziale finché non trova l'ultimo valore pertinente. Una scansione dell'intervallo dell'indice è molto più efficiente della scansione completa della tabella richiesta da DATE(x) = '2016-09-01
.
Non essere tentato di usarlo, anche se sembra più efficiente.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Ha la stessa efficienza della scansione dell'intervallo, ma selezionerà le righe con valori di x
scendono esattamente a mezzanotte del 2-Sept-2016, che non è quello che vuoi.