web-dev-qa-db-fra.com

MySQL sélectionne des lignes d'il y a exactement 7 jours

Je suis complètement perplexe sur celui-ci, essayant pendant des heures mais sans succès, en espérant que quelqu'un puisse aider. Essayer de créer un script cron à exécuter quotidiennement qui renvoie les lignes qui ont exactement 7 jours de plus que la date actuelle.

Le fait est que ma requête ne renvoie rien. Aucun message d'erreur, rien (je sais qu'il y a des entrées dans la base de données au cours des 7 derniers jours - nous recevons environ 7000 nouvelles entrées par jour, donc elles sont là!) J'ai essayé un SELECT * et j'ai fait écho à la date d'édition avec succès , donc tout fonctionne, à part mon script SQL.

La colonne à laquelle je fais référence (edit_date) est de type 'datetime' formatée avec Y-m-d h-m-s. Cette colonne a toujours une valeur datetime affectée à la fois à la création et à la modification.

function get_ad_sql($table){
    $sql = "SELECT 
                * 
            FROM 
                ".$table." 
            WHERE 
                edit_date = DATE_SUB(NOW(), INTERVAL 7 DAY)
            ";  
    return $sql;
}

Et appeler la fonction et 'essayer' de faire écho à la clé primaire:

$sqlAng = get_ad_sql('angebote');
$result = mysql_query($sqlAng);
while($row = mysql_fetch_array($result)){
    echo $row['primary_key'];
}

J'ai essayé toutes les variantes de DATE_SUB (NOW (), INTERVAL 7 DAY), y compris CURDATE (), DATE_FORMAT (edit_date, '% m /% d /% Y') que j'ai pu trouver ici et en ligne, mais je n'ai pas pu ' t rien faire fonctionner. J'espère que quelqu'un pourra m'aider!

21
Tim Blackburn

Il est très rare d'obtenir les mêmes entrées datetime qui donnent la date et l'heure en secondes. Par conséquent, pour obtenir des résultats appropriés, nous devons ignorer la partie heure et traiter la partie date, donc en utilisant la fonction CURDATE().

Vous pouvez faire cela en ignorant la partie horaire et comparer avec la date en utilisant ce qui suit:

function get_ad_sql($table){
    $sql = "SELECT 
                * 
            FROM 
                ".$table." 
            WHERE 
                DATE(edit_date) = DATE_SUB(CURDATE(), INTERVAL 7 DAY)
            ";  
    return $sql;
}
33
Ghazanfar Mir

NOW () renvoie la valeur DATETIME, vous devez utiliser une fonction DATE pour obtenir la date sans heure, par ex. -

SELECT * FROM table WHERE edit_date = DATE_SUB(DATE(NOW()), INTERVAL 7 DAY);

Si le type de edit_date champ est DATETIME, alors ce champ doit également être encapsulé par la fonction DATE () -

SELECT * FROM table WHERE DATE(edit_date) = DATE_SUB(DATE(NOW()), INTERVAL 7 DAY);
5
Devart

Votre script fonctionne ... Je doute fortement que vous ayez quelque chose exactement il y a 7 jours (à la seconde).

Peut-être que vous vouliez quelque chose WHERE edit_date>DATE_SUB(NOW, INTERVAL 7 DAY) AND edit_date<DATE_SUB(NOW, INTERVAL 6 DAY)?

Ou, si vous souhaitez comparer uniquement les parties de date (et non l'heure), comparez la sortie de DATE() à la place.

3
Brad
 SELECT SUBDATE(CURDATE(), 7)

Essaye ça.

2
abi740