MySQL sélectionne la date d'hier

101

Comment afficher et compter les valeurs dont les dates sont d'hier? J'avais l'habitude time()d'insérer la date dans la base de données. Exemple:

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

Je veux afficher le nombre d'URL qui en ont plusieurs dans le tableau et également le nombre de ces URL qui ont été visitées hier. Exemple de résultat:

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

J'ai déjà l'idée d'obtenir la date d'hier, mais je n'ai aucune idée du nombre de fois qu'une URL a existé hier et du nombre de fois qu'une URL a existé dans le tableau.

PinoyStackOverflower
la source

Réponses:

166

Le moyen le plus simple et le meilleur pour obtenir la date d'hier est:

subdate(current_date, 1)

Votre requête serait:

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

Pour les curieux, la raison qui sum(condition)vous donne le nombre de lignes qui satisfont à la condition, qui autrement exigerait une caseinstruction lourde et verbeuse , est que dans mysql les valeurs booléennes sont 1pour true et 0pour false, donc la somme d'une condition compte effectivement combien de fois c'est vrai. L'utilisation de ce modèle peut améliorer votre code SQL.

Bohème
la source
89
SELECT SUBDATE(NOW(),1);

où la fonction now () renvoie la date et l'heure actuelles du système dans Timestamp ...

vous pouvez utiliser:

SELECT SUBDATE(CURDATE(),1)
Romancha KC
la source
3
A travaillé pour moi. Merci beaucoup
mable george
20

Vous pouvez utiliser:

SELECT SUBDATE(NOW(), 1);

ou

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

ou

SELECT NOW() - INTERVAL 1 DAY;

ou

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
simhumileco
la source
11

Vous pouvez obtenir la date d'hier en utilisant l'expression CAST(NOW() - INTERVAL 1 DAY AS DATE). Donc, quelque chose comme ça pourrait fonctionner:

SELECT * FROM your_table

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

Requête pour les dernières semaines:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
NCrash
la source
9

Calcul de la date, de la semaine, du mois et de l'année dernière ou suivante. Cela pourrait être utile à n'importe qui.

Date actuelle:

select curdate();

Hier:

select subdate(curdate(), 1)

Demain:

select adddate(curdate(), 1)

Dernière semaine:

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

1 semaine prochaine:

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

1 mois dernier:

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

Le mois suivant:

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

Mois en cours:

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

Dernière année:

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

1 an prochain:

between adddate(curdate(), 365) and adddate(curdate(), 1)
Atequer Rahman
la source
7

Bien que la réponse choisie soit correcte et plus concise, je soutiendrais la structure notée dans d'autres réponses:

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));

Si vous avez juste besoin d'une date nue sans horodatage, vous pouvez également l'écrire comme suit:

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

La raison de l'utilisation de CASTversus SUBDATEest la CASTsyntaxe ANSI SQL. SUBDATEest une implémentation spécifique à MySQL du composant arithmétique de date de CAST. Prendre l'habitude d'utiliser la syntaxe ANSI peut réduire les maux de tête si jamais vous devez migrer vers une autre base de données. Il est également bon d'avoir l'habitude en tant que pratique professionnelle car vous travaillerez presque certainement avec d'autres SGBD à l'avenir.

Aucun des principaux systèmes de SGBD n'est entièrement compatible ANSI, mais la plupart d'entre eux implémentent le large ensemble de syntaxe ANSI alors que presque aucun d'entre eux en dehors de MySQL et de ses descendants (MariaDB, Percona, etc.) n'implémentera la syntaxe spécifique à MySQL.

trclark81
la source
Bonnes explications quant aux raisons pour lesquelles on choisirait l'un plutôt que l'autre
Sablefoste
4

J'ai adapté l'une des réponses ci-dessus de cdhowie car je ne pouvais pas la faire fonctionner. Cela semble fonctionner pour moi. Je soupçonne qu'il est également possible de le faire avec la fonction UNIX_TIMESTAMP utilisée.

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));
John-Paul Stanford
la source