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, galerinha...
Estou enfrentando um problema, que me fez recorrer a vocês aqui no forum.
Tenho um sistema que registra as horas que foram trabalhadas tipo:
o usuário loga e informas quem trabalhou por exemplo de 08:00:00 as 12:00:00,
dai se ele quiser incluir outro registro das 09:00:00 as 11:00:00 ele o faz.
Minha lógica foi abaixo pois não consigo bloquear esse período que já existe no BD.
segue um esboço do que tentei bloquear
//Checa se já foi inserido nesse mesmo horário
$hi = substr($HI, 0, 2); // pegar as horas da variavel
$hf = substr($HF, 0, 2); // pegar as horas da variavel
$hj = date("Y-m-d"); //dia atual
$sqlhj = mssql_query("select SUBSTRING(HoraInicial, 1, 2) as hi, SUBSTRING(Horafinal, 1, 2) as hf from dbo.Apropriacao
where Data = '$hj' and id = '$ID'
and SUBSTRING(HoraInicial, 1, 2) >= '$hi'
and SUBSTRING(Horafinal, 1, 2) <= '$hf'");
$verificahj = mssql_num_rows($sqlhj);
if ($verificahj != NULL) {
echo mb_convert_encoding("<b><font size='2' face='Arial' color='#FF0000'>OBS.: Horário escolhido, já preenchido anteriormente.</font></b>", "ISO-8859-1", "UTF-8");
echo "<Iframe src='/Aprora WEB/php/Preenchimento.php' width='797' height='200' frameborder='0' scrolling='auto' name='myFrame'></Iframe>";
exit;
}>
Primeira coisa, seria utilizar os tipos corretos de campo no banco de dados.
Eu dividiria na tabela, ainda, o campo data dos horários de entrada e saída, como por exemplo:
CREATE TABLE horario (
id INTEGER NOT NULL AUTO_INCREMENT,
codusuario INTEGER,
data_horario DATE,
inicio TIME,
fim TIME,
PRIMARY KEY(id)
);
INSERT INTO horario (codusuario,data_horario,inicio,fim) values
(1, CURRENT_DATE,'08:00:00','12:00:00'),
(1, CURRENT_DATE,'14:00:00','18:00:00');
Depois fica mais fácil.
É só ver se a data e hora de inicio e fim informadas pelo usuário intercalam com algum horário já cadastrado para ele:
$pdo = new PDO('mysql:host=127.0.0.1;dbname=testes','root','');
$data = date('Y-m-d');
$horaInicio = '08:00:00';
$horaFim = '12:00:00';
$codusuario = 1;
$sql = "SELECT COUNT(*) as total FROM horario
WHERE data_horario = '%1\$s'
AND ( (ADDTIME('%2\$s',1) BETWEEN inicio AND fim) OR (ADDTIME('%3\$s',-1) BETWEEN inicio AND fim) OR
(ADDTIME(inicio,1) BETWEEN '%2\$s' AND '%3\$s') OR (ADDTIME(fim, -1) BETWEEN '%2\$s' AND '%3\$s') )
AND codusuario = %4\$d";
$sql = sprintf($sql, $data, $horaInicio, $horaFim, $codusuario);
$rs = $pdo->query($sql);
$row = $rs->fetch(PDO::FETCH_ASSOC);
if($row['total'] > 0){
// nao pode inserir
} else {
// pode inserir
}
@braços e fique com Deus!
Muito grato pela ajuda, mas o sistema já está em produção e a chefia não libera pra alteração de tipos
dai é o famoso "SE VIRA NOS 30"
E a base de dados é o SQL SERVER 2005 dai muitas funções não funcionam com o ADDTIME
Mas muito grato pela força
Na verdade eu precisava pegar esse intervalo de horas e proibir que a hora inicial ou fina estejam nesse intervalo
é isso que não estou conseguindo
Primeira coisa, seria utilizar os tipos corretos de campo no banco de dados.
Eu dividiria na tabela, ainda, o campo data dos horários de entrada e saída, como por exemplo:
Depois fica mais fácil.
É só ver se a data e hora de inicio e fim informadas pelo usuário intercalam com algum horário já cadastrado para ele:
} else { // pode inserir }@braços e fique com Deus!