私はこれに完全に困惑しており、何時間も努力していますが、誰かが助けてくれることを期待して成功しませんでした。現在の日付より正確に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何でも動作させる。誰かが私を助けてくれることを願っています!
日付と時刻を最大数秒で指定する同じdatetimeエントリを取得することは非常にまれです。したがって、適切な結果を得るには、時間部分を無視して日付部分を処理する必要があるため、CURDATE()
関数を使用します。
あなたは時間の部分を無視してそれを行い、以下を使用して日付と比較することができます:
function get_ad_sql($table){
$sql = "SELECT
*
FROM
".$table."
WHERE
DATE(edit_date) = DATE_SUB(CURDATE(), INTERVAL 7 DAY)
";
return $sql;
}
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);
あなたのスクリプトは機能しています...私はあなたが何かを持っていることを強く疑っています正確に7日前(秒まで)。
たぶん、あなたは何かを望んだWHERE edit_date>DATE_SUB(NOW, INTERVAL 7 DAY) AND edit_date<DATE_SUB(NOW, INTERVAL 6 DAY)
?
または、日付ではなく(時刻ではなく)部分のみを比較する場合は、代わりに DATE()
の出力を比較します。
SELECT SUBDATE(CURDATE(), 7)
これを試して。