Подтвердить что ты не робот

MySQL выбирает строки ровно 7 дней назад

Я полностью зациклен на этом, пытаясь часами, но без успеха, надеясь, что кто-то может помочь. Попытка создать cron script для ежедневной работы, которая возвращает строки, которые на 7 дней старше текущей.

Дело в том, что мой запрос ничего не возвращает. Нет сообщений об ошибках, ничего (я знаю, что в базе данных есть записи за последние 7 дней - мы получаем около 7000 новых записей в день, так что они есть!) Я пробовал SELECT * и успешно удалял дату редактирования, поэтому все работает, кроме моего SQL script.

В столбце, на который я ссылаюсь (edit_date), находится тип datetime, сформированный с помощью Y-m-d h-m-s. Этот столбец всегда имеет значение даты и времени, назначенное как для создания, так и для редактирования.

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'];
}

Я пробовал все варианты DATE_SUB (NOW(), INTERVAL 7 DAY), включая CURDATE(), DATE_FORMAT (edit_date, "% m/% d/% Y" ), которые я мог найти здесь и в Интернете, но не мог заставить ничего работать. Надеюсь, кто-то может мне помочь!

4b9b3361

Ответ 1

Очень редко можно получить те же записи даты и времени, что дает дату и время до нескольких секунд. Поэтому для получения соответствующих результатов нам нужно игнорировать временную часть и обрабатывать дату, таким образом, используя функцию CURDATE().

Вы можете сделать это, игнорируя часть времени, и сравните ее с датой, используя следующую команду:

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

Ответ 2

Ваш script работает... Я очень сомневаюсь, что у вас есть что-то точно 7 дней назад (ко второму).

Возможно, вам нужно что-то WHERE edit_date>DATE_SUB(NOW, INTERVAL 7 DAY) AND edit_date<DATE_SUB(NOW, INTERVAL 6 DAY)?

Или, если вы хотите сравнить только дату (а не время), сравните результат DATE().

Ответ 3

СЕЙЧАС() возвращает значение 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);

Ответ 4

 SELECT SUBDATE(CURDATE(), 7)

Попробуйте это.