Como excluir linhas com base nas diferenças de data com o MySQL?
Pergunta
Preciso excluir linhas onde um campo de tempo de dados tem mais de 2 semanas de idade.
Isso é o que eu criei
$duration = Date::WEEK * 2; // int(1209600)
$query = 'DELETE FROM properties
WHERE TIMEDIFF(' . date(DATE_ISO8601) . ', reserved_datetime) > ' . $duration;
Muitas vezes, não escrevo consultas complicadas (preferindo fazer coisas no PHP, onde estou mais confortável), mas gostaria de saber mais sobre elas, além de fazer esse tipo de coisa no PHP, seria muito ineficiente e estou lidando com uma grande quantidade de linhas.
Alguém sabe o que estou fazendo de errado? Felicidades.
Atualizar
Eu dei A resposta de Wallyk Um tiro, mudando um pouco em phpmyadmin para selecionar apenas para que eu pudesse ver o que estava acontecendo.
Isso é o que eu usei
SELECT *
FROM properties
WHERE date_sub( `reserved_datetime` , INTERVAL 2 week ) >0
LIMIT 0 , 30
O único problema, no entanto, é que ele retornou linhas onde o reserved_datetime
é 2010-02-28 10:45:59
, definitivamente menos de 2 semanas atrás (a partir de agora).
Pensei em verificar a data interna do MySQL. Eu tenho usado date(DATE_ISO8601)
Nas minhas perguntas, porque o MySQL's NOW()
não estava exatamente certo (apenas retornou se estiver interessado 2010-02-28 20:09:19
).
Existe uma maneira de especificar a data atual nessa consulta? Alguma outra sugestão?
Muito Obrigado
Outra atualização
Aqui está uma captura de tela do phpmyadmin que pode demonstrar algo melhor do que minhas palavras. Ah, e a razão pela qual ele voltou apenas 3 é porque todos os outros têm valores em branco, ou seja, 0000-00-00 00:00:00
Solução
Usar:
FROM PROPERTIES p
WHERE p.reserved_datetime <= DATE_SUB(NOW(), INTERVAL 2 WEEK)
Lembre -se disso por usar NOW()
, a data de duas semanas incluirá a parte da hora.
Outras dicas
A resposta de Wallyk não está correta. Pense no que você está fazendo - subtrair duas semanas de quase qualquer data ainda será maior que zero (zero = 1/1/1970). Eu acho que você quer algo mais assim:
DELETE FROM properties WHERE DATE_SUB(NOW(), INTERVAL 2 WEEK) > reserved_datetime
Não tenho um banco de dados MySQL, então não posso dizer se funcionar com certeza, mas funciona no PostgreSQL:
DELETE FROM properties WHERE (NOW() - reserved_datetime < interval '2 weeks')
Tente isso em vez disso:
$query = 'DELETE FROM properties
WHERE date_sub(reserved_datetime, interval 2 week) > 0';
Isso assume isso reserved_datetime
é o nome do campo na tabela.
(Testado com o MySQL 5.0.46-padrão.)