web-dev-qa-db-fra.com

Sélectionnez des enregistrements à partir d'aujourd'hui, cette semaine, ce mois-ci php mysql

J'imagine que c'est assez simple, mais je ne peux pas le comprendre. J'essaie de faire quelques pages - une qui contiendra les résultats sélectionnés dans le tableau de ma base de données mysql pour aujourd'hui, cette semaine et ce mois. Les dates sont entrées lors de la création de l'enregistrement avec date('Y-m-d H:i:s');. Voici ce que j'ai jusqu'à présent:

jour où date> (date- (60 * 60 * 24))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24)) ORDER BY score DESC"

semaine où date> (date- (60 * 60 * 24 * 7))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24*7)) ORDER BY score DESC"

mois (30 jours) où date> (date- (60 * 60 * 24 * 30))

 "SELECT * FROM jokes WHERE date>(date-(60*60*24*30)) ORDER BY score DESC"

Toutes les idées seraient très appréciées. Merci!

65
Andrew Samuelsen

En supposant que votre colonne de date soit une colonne de date MySQL:

SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;        
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 WEEK) ORDER BY score DESC;
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 MONTH) ORDER BY score DESC;
117
Nathan Ostgard

Essayez d’utiliser les fonctions de date et d’heure (MOIS (), ANNÉE (), JOUR (), Manuel MySQL )

Cette semaine:

SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW());

La semaine dernière:

SELECT * FROM jokes WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW())-1;
69
mo.

Mois en cours:

SELECT * FROM jokes WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date)=MONTH(NOW());

Cette semaine:

SELECT * FROM jokes WHERE WEEKOFYEAR(date) = WEEKOFYEAR(NOW());

Jour actuel:

SELECT * FROM jokes WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date) = MONTH(NOW()) AND DAY(date) = DAY(NOW());

Cela ne sélectionnera que le mois en cours, vraiment la semaine et vraiment seulement aujourd'hui :-)

36
Lukas Brzak

La réponse de Nathan vous donnera des blagues des dernières 24, 168 et 744 heures, PAS les blagues d'aujourd'hui, cette semaine, ce mois-ci. Si c'est ce que vous voulez, c'est bien, mais je pense que vous cherchez peut-être quelque chose de différent.

En utilisant son code, à midi, vous obtiendrez les blagues commençant hier à midi et se terminant aujourd'hui à midi. Si vous voulez vraiment les blagues du jour, essayez ce qui suit:

SELECT * FROM jokes WHERE date >= CURRENT_DATE() ORDER BY score DESC;  

Vous auriez à faire quelque chose d'un peu différent de la semaine, du mois, etc. en cours, mais vous voyez l'idée.

9
David van Geest

Tout le monde semble faire référence à la date comme étant une colonne du tableau.
Je ne pense pas que ce soit une bonne pratique. La date Word pourrait bien être un mot-clé dans un langage de codage (peut-être Oracle), veuillez donc modifier la date du nom de la colonne en peut-être JDate.
Ainsi, les éléments suivants fonctionneront mieux:

SELECT * FROM jokes WHERE JDate >= CURRENT_DATE() ORDER BY JScore DESC;

Nous avons donc une table appelée Jokes avec les colonnes JScore et JDate.

4
KarlosFontana

Une meilleure solution pour "aujourd'hui" est:

SELECT * FROM jokes WHERE DATE(date) = DATE(NOW())
3
JoeGalind

La réponse de Nathan est très proche mais elle retournera un jeu de résultats flottant. À mesure que le temps passe, les enregistrements vont flotter dans l'ensemble de résultats. L'utilisation de la fonction DATE() sur NOW() supprimera l'élément time de la date créant un jeu de résultats statique. Étant donné que la fonction date() est appliquée à now() au lieu de la colonne date, les performances de la colonne devraient être plus élevées, car l'application d'une fonction telle que date() à une colonne de date inhibe la capacité de MySQL à utiliser un index.

Pour conserver l'utilisation statique du jeu de résultats:

SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 DAY) 
ORDER BY score DESC;

SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 WEEK) 
ORDER BY score DESC;

SELECT * FROM jokes WHERE date > DATE_SUB(DATE(NOW()), INTERVAL 1 MONTH) 
ORDER BY score DESC;
2
Kevin Bowersox

Eh bien, cette solution vous aidera à sélectionner uniquement le mois en cours, la semaine en cours et seulement aujourd'hui.

SELECT * FROM games WHERE games.published_gm = 1 AND YEAR(addedon_gm) = YEAR(NOW()) AND MONTH(addedon_gm) = MONTH(NOW()) AND DAY(addedon_gm) = DAY(NOW()) ORDER BY addedon_gm DESC;

Pour les articles hebdomadaires ajoutés:

WEEKOFYEAR(addedon_gm) = WEEKOFYEAR(NOW())

Pour les postes ajoutés mensuellement:

MONTH(addedon_gm) = MONTH(NOW())

Pour les postes ajoutés annuellement:

YEAR(addedon_gm) = YEAR(NOW())

vous obtiendrez les résultats exacts où n’afficheront que les jeux ajoutés aujourd’hui, sinon vous pourrez afficher: "Aucun nouveau jeu trouvé pour aujourd’hui". L'utilisation du jeu d'enregistrements ShowIF est une transaction vide.

0
Al3abMizo Games

Je pense que l'utilisation de la fonction NOW() est incorrecte pour obtenir le décalage horaire. Parce que par la fonction NOW() à chaque fois que vous calculez les dernières 24 heures ..__, vous devez utiliser CURDATE() à la place. 

    function your_function($time, $your_date) {
    if ($time == 'today') {
        $timeSQL = ' Date($your_date)= CURDATE()';
    }
    if ($time == 'week') {
        $timeSQL = ' YEARWEEK($your_date)= YEARWEEK(CURDATE())';
    }
    if ($time == 'month') {
        $timeSQL = ' Year($your_date)=Year(CURDATE()) AND Month(`your_date`)= Month(CURDATE())';
    }

    $Sql = "SELECT * FROM jokes WHERE ".$timeSQL
    return $Result = $this->db->query($Sql)->result_array();
}
0
ganji

Pour obtenir les données de la semaine dernière dans MySQL. Cela fonctionne pour moi même à travers les limites de l'année. 

select * from orders_order where YEARWEEK(my_date_field)= YEARWEEK(DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK));

Pour obtenir les données de la semaine en cours 

select * from orders_order where YEARWEEK(date_sold)= YEARWEEK(CURRENT_DATE());
0
Sharad