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 su DATETIME .
  • Questo modello evita di gestire gli anni bisestili e altri calcoli di dati.
  • Funziona se x è DATE , DATETIME o TIMESTAMP .

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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow