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" ), которые я мог найти здесь и в Интернете, но не мог заставить ничего работать. Надеюсь, кто-то может мне помочь!
Ответы
Ответ 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)
Попробуйте это.