MySQL seleziona la data di ieri


101

Come posso visualizzare e contare i valori le cui date sono ieri? Ho usato time()per inserire la data nel database. Esempio:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

Voglio visualizzare quanti URL sono presenti più nella tabella e anche quanti di quell'URL sono stati visitati ieri. Risultato di esempio:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

Ho già l'idea di ottenere la data di ieri, ma non ho idea di contare quante volte un URL è esistito per ieri e di contare quante volte un URL è esistito nella tabella.

Risposte:


166

Il modo più semplice e migliore per ottenere la data di ieri è:

subdate(current_date, 1)

La tua domanda sarebbe:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

Per i curiosi, il motivo che sum(condition)ti dà il conteggio delle righe che soddisfano la condizione, che altrimenti richiederebbe caseun'affermazione ingombrante e prolissa , è che in mysql i valori booleani sono 1per vero e 0per falso, quindi sommare una condizione conta effettivamente quante volte è vero. L'utilizzo di questo modello può riorganizzare il codice SQL.


89
SELECT SUBDATE(NOW(),1);

dove la funzione now () restituisce la data e l'ora correnti del sistema in Timestamp ...

Puoi usare:

SELECT SUBDATE(CURDATE(),1)

3
Ha funzionato per me. Molte grazie
mable george

20

Puoi usare:

SELECT SUBDATE(NOW(), 1);

o

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

o

SELECT NOW() - INTERVAL 1 DAY;

o

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

11

Puoi ottenere la data di ieri utilizzando l'espressione CAST(NOW() - INTERVAL 1 DAY AS DATE). Quindi qualcosa del genere potrebbe funzionare:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

9

Query per le ultime settimane:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()

9

Ultima o successiva data, settimana, mese e anno di calcolo. Potrebbe essere utile per chiunque.

Data odierna:

select curdate();

Ieri:

select subdate(curdate(), 1)

Domani:

select adddate(curdate(), 1)

Ultima 1 settimana:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

Prossima 1 settimana:

between adddate(curdate(), 7) and adddate(curdate(), 1)

Ultimo 1 mese:

between subdate(curdate(), 30) and subdate(curdate(), 1)

Il prossimo mese:

between adddate(curdate(), 30) and adddate(curdate(), 1)

Corrente mese:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

Ultimo 1 anno:

between subdate(curdate(), 365) and subdate(curdate(), 1)

Il prossimo anno:

between adddate(curdate(), 365) and adddate(curdate(), 1)

7

Sebbene la risposta scelta sia corretta e più concisa, sostengo la struttura annotata in altre risposte:

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

Se hai solo bisogno di una data nuda senza timestamp, puoi anche scriverla come segue:

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

Il motivo per l'utilizzo di CASTversus SUBDATEè la CASTsintassi ANSI SQL. SUBDATEè un'implementazione specifica di MySQL del componente aritmetico della data di CAST. Prendere l'abitudine di utilizzare la sintassi ANSI può ridurre i mal di testa nel caso in cui dovessi migrare a un database diverso. È anche positivo avere l'abitudine come pratica professionale poiché quasi sicuramente lavorerai con altri DBMS in futuro.

Nessuno dei principali sistemi DBMS è completamente conforme ad ANSI, ma la maggior parte implementa l'ampio set di sintassi ANSI mentre quasi nessuno di loro al di fuori di MySQL e dei suoi discendenti (MariaDB, Percona, ecc.) Implementerà la sintassi specifica di MySQL.


Buone spiegazioni sul motivo per cui uno dovrebbe scegliere uno piuttosto che l'altro.
Sablefoste

4

Ho adattato una delle risposte di cui sopra da cdhowie perché non riuscivo a farlo funzionare. Questo sembra funzionare per me. Sospetto che sia anche possibile farlo con la funzione UNIX_TIMESTAMP utilizzata.

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.