web-dev-qa-db-ja.com

MySQLは正確に7日前の行を選択します

私はこれに完全に困惑しており、何時間も努力していますが、誰かが助けてくれることを期待して成功しませんでした。現在の日付より正確に7日古い行を返す、毎日実行するcronスクリプトを作成しようとしています。

問題は、私のクエリが何も返さないことです。エラーメッセージはありません、何もありません(過去7日間のDBにエントリがあることはわかっています。1日に約7000の新しいエントリがあるため、そこにあります!)SELECT *を試して、編集日をエコーし​​て成功なので、SQLスクリプトを除いてすべてが機能しています。

私が参照している列(edit_date)は、Y-m-d h-m-sでフォーマットされたタイプ 'datetime'です。この列には、作成と編集の両方で常に割り当てられた日時値があります。

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

そして、関数を呼び出し、primary_keyをエコーするために「試行」します。

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

私はこことオンラインで見つけられたが、できなかったCURDATE()、DATE_FORMAT(edit_date、 '%m /%d /%Y')を含む、DATE_SUB(NOW()、INTERVAL 7 DAY)のすべてのバリエーションを試しましたt何でも動作させる。誰かが私を助けてくれることを願っています!

21
Tim Blackburn

日付と時刻を最大数秒で指定する同じdatetimeエントリを取得することは非常にまれです。したがって、適切な結果を得るには、時間部分を無視して日付部分を処理する必要があるため、CURDATE()関数を使用します。

あなたは時間の部分を無視してそれを行い、以下を使用して日付と比較することができます:

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()はDATETIME値を返します。時間のない日付を取得するには、DATE関数を使用する必要があります。 -

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

edit_dateフィールドのタイプがDATETIMEの場合、このフィールドもDATE()関数でラップする必要があります-

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

あなたのスクリプトは機能しています...私はあなたが何かを持っていることを強く疑っています正確に7日前(秒まで)。

たぶん、あなたは何かを望んだWHERE edit_date>DATE_SUB(NOW, INTERVAL 7 DAY) AND edit_date<DATE_SUB(NOW, INTERVAL 6 DAY)

または、日付ではなく(時刻ではなく)部分のみを比較する場合は、代わりに DATE() の出力を比較します。

3
Brad
 SELECT SUBDATE(CURDATE(), 7)

これを試して。

2
abi740