Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia pessoal, tudo bem?
Possuo um cadastro de liberação de acesso em uma página onde o usuário poderá ver seu conteúdo em um determinado período do dia. Até ai tudo certo.
Possuo uma tabela (tb_controle_acessos) com as seguintes colunas:
**id_pagina** => 2
**dia_semana **=> Monday
**acesso_ini **=> 11:00 AM
**acesso_fim **=> 01:00 AM
Esta configuração será mantida para todas as Segundas-feira do mês ok?
O Problema:
Se observarem, o problema está no horário, onde a liberação irá iniciar às 11:00 AM de Segunda e bloquear após 01:00 AM, mas este 01:00 AM já é do outro dia (Tuesday).
Eu utilizando o Between direto no banco não dá certo e nem fazendo uma verificação utilizando uma estrutura de controle ***IF* **para validar o se o usuário está dentro do período permitido.
Acho que consegui explicar :)
Agradeço se conseguirem me dar uma Luz!!!
Como você está fazendo o between ?
Veja ai abaix como estou fazendo com between... Vlw
$NOW = date('g:i A'); $today = date('l'); SELECT * FROM tabela_controle_acessos WHERE ('$NOW' BETWEEN ACESSO_INI AND ACESSO_FIM) AND dia_semana = '$today'
O problema, é a falta de informações na tabela. Essa falta de informações dificulta/impede o BETWEEN.
Considerando que hoje é sexta-feira, e você tenha em sua tabela:
Friday
11:00 AM
01:00 AM
A primeira coisa que se precisa fazer, é converter essa informação para alguma coisa trabalhável, por exemplo:
Friday, Jun 7, 2013 - 11:00 AM
Saturday, Jun 8, 2013 - 01:00 AM
Para fazer isso, você pode utilizar algumas funções do MySQL:
SELECT DATE_FORMAT(NOW(), "%b %e, %Y");
Com isso, você pode utilizar CONCAT para agregar a informação e, então, STR_TO_DATE, para transformar a informação em alguma coisa trabalhável, por exemplo:
SELECT STR_TO_DATE(CONCAT(dia_semana, DATE_FORMAT(NOW(), ", %b %e, %Y - "), acesso_ini), "%W, %b %e, %Y - %l:%i %p") FROM tb_controle_acessos;
Do ponto de vista lógico, se o horário final for menor que o horário inicial, então significa que o final acontece no outro dia, então, basta verificar:
SELECT IF(@ini>@fim, DATE_ADD(@fim, INTERVAL 1 DAY), @fim) AS fim;
Com isso, você consegue criar uma instrução completa, por exemplo:
SELECT
@ini=STR_TO_DATE(CONCAT(dia_semana, DATE_FORMAT(NOW(), ", %b %e, %Y - "), acesso_ini), "%W, %b %e, %Y - %l:%i %p"),
@fim=STR_TO_DATE(CONCAT(dia_semana, DATE_FORMAT(NOW(), ", %b %e, %Y - "), acesso_fim), "%W, %b %e, %Y - %l:%i %p"),id_pagina,
@ini AS inicio,
IF(@ini>@fim, DATE_ADD(@fim, INTERVAL 1 DAY), @fim) AS fim
FROM tb_controle_acessos;
Obviamente, isso ainda não resolve seu problema, você apenas normalizou os dados. Para obter os lugares que estão abertos nesse instante, fica assim:
SELECT `id_pagina`, `inicio`, `fim` FROM
(SELECT
@ini=STR_TO_DATE(CONCAT(dia_semana, DATE_FORMAT(NOW(), ", %b %e, %Y - "), acesso_ini), "%W, %b %e, %Y - %l:%i %p"),
@fim=STR_TO_DATE(CONCAT(dia_semana, DATE_FORMAT(NOW(), ", %b %e, %Y - "), acesso_fim), "%W, %b %e, %Y - %l:%i %p"),
id_pagina,
@ini AS inicio,
IF(@ini>@fim, DATE_ADD(@fim, INTERVAL 1 DAY), @fim) AS fim
FROM tb_controle_acessos) AS n
WHERE NOW() BETWEEN inicio AND fim
Com isso, o que é da base, fica na base. Seu código PHP ficará apenas com a responsabilidade de tratar as informações, segundo suas regras de negócio.
;)
bom, pensei em uma forma que talvez não seja muito sutil, porem creio que te dê uma solução
crie mais um campo no sua tabela que vá armazenar o nome Tuesday
Então compare se o dia atual for Tuesday e a Hora for 01:01 AM ele bloqueia o acesso!
Espero ter ajudado