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

query

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top