Antes de eu mostrar como fazer, eu vou explicar a lógica.
A tabela tem que ter um campo para o
valor provisório, um campo para o
valor definitivo e um campo do tipo
DATETIME.
Quando alguém modificar o valor do produto, o novo valor vai cair no campo
valor_definitivo e o valor antigo vai pular para o campo
valor_provisorio. A cada UPDATE de valor, o campo
datahora será atualizado com a função NOW().
Na hora de fazer a consulta para listar os produtos, a idéia é a seguinte:
Verificar quantas horas tem entre a data/hora que está no registro e a data/hora atual.
Se o resultado for maior ou igual a 12 horas, o
valor_definitivo será atribuído ao alias
valor. Caso contrário, o
valor_provisorio é que será atribuido ao alias
valor.
Agora eu vou mostrar como fazer isso...
Conheço duas formas de fazer esse negócio virar realidade.
Função IF() do MySQLÉ bem simples, essa função lembra bastante a condicional resumida do PHP
(codição ? verdadeiro : falso).
IF('condição', 'isso se for verdadeiro', 'isso se for falso')
Veja como aplicar:
SELECT IF(TIMEDIFF(NOW(), data) >= '12:00:00', valor_definitivo, valor_provisorio) as valor FROM tabela
TIMEDIFF(NOW(), data) >= '12:00:00' é a minha condição. TIMEDIFF retorna a diferença que existe entre a data/hora do registro e a data/hora atual. Se esse valor for maior ou igual a
12:00:00, o mysql vai pegar o
valor_definitivo e atribuir ao alias
valor, caso contrário vai pegar o
valor_provisorio e atribuir ao alias
valor.
Expressão CASEÉ um pouco mais complexa, é bastante útil se quiser colocar várias condições seguindo aquela estrutura if, else if, else. Se não me engano, não é possível colocar várias condições na função IF() do MySQL.
(CASE WHEN 'condição' THEN 'isso se for verdadeiro' ELSE 'isso se for falso' END)
Veja a simulação do if, else if, else:
(CASE WHEN 'condição 1' THEN 'isso se for verdadeiro' WHEN 'condição 2' THEN 'isso se for verdadeiro' ELSE 'isso se não der verdadeiro em nenhuma condição' END)
Veja como aplicar:
SELECT (CASE WHEN TIMEDIFF(NOW(), data) THEN valor_definitivo ELSE valor_provisorio END) as valor FROM tabela
Acho legal você trabalhar com condicional na query, dessa forma quando alguém modificar o valor do produto, o novo valor só aparecerá depois de 12 horas exatas.
Gostou da pequena explicação?