Jump to content


Photo

Fazer Diferença De Horas Que Estão No Mysql, Mas...


  • Faça o login para participar
40 replies to this topic

#1 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 25/01/2009, 02:45

como fazer diferença de horas pela maneira como está nesta screen q envio?
funciona assim:
envio uma hora...e regista no entra...e no sai fica nada...(00:00:00)
e depois envio outra hora...e regista no sai...e no entra fica nada ...(00:00:00)

como saber as horas que foram trabalhadas por dia?
vejam a screen...e digam algo please. dêem exemplos pra testar...e aprender obvio ;)
Posted Image

#2 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 25/01/2009, 03:05

Tu quer fazer tipo uma máquina de ponto... pro cara bater o ponto dele na entrada e na saída do trampo :D

Bom se for mais ou menos isso...

Basta seguir o que vc já vem fazendo ali... tipo:

dia 23...
o cara entrou marca ( INSERT no entra ) a hora da entrada e mantém hora da saída como um valor padrão 00:00:00...
o cara saiu marca a hora da saída ( UPDATE mo sai).

Tá mas o cara voltou... e indendente de ter voltado no mesmo dia... a cada login/bater ponto/etc hehehehe é sempre inserido um registro e a cada saída é atualizado o último registro

Então no memso dia 23...
O cara voltou então já seria outro registro e (INSERT em entra) e repete o procedimento da explicação acima.
O cara saiu ... mesma coisa de antes...

Bom ... com os dados sendo registrados desta forma, basta somar a diferença de todas as entradas e saídas

primeira entrada e saída:

05:00:00 - 05:20:00

diferença -> 00:20:00

primeira entrada e saída:

06:00:00 - 06:20:00

diferença -> 00:20:00

00:20:00
00:20:00
-----------
00:40:00

Entendeu o que seria a soma da diferença?

Ou isso vc já sabia e o problema é em como escrever o script para fazer isso :ponder: Até mais

#3 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 25/01/2009, 15:23

Tem que usar a função strtotime() para fazer isso, não? :ponder:

Não consigo entender essa função de jeito nenhum.
att,
Muller Dias
ex-administrador Fórum WMO

#4 Dudu

Dudu

    Viva la vida

  • Usuários
  • 1437 posts
  • Sexo:Masculino
  • Localidade:Uberlândia - MG
  • Interesses:PHP

Posted 25/01/2009, 16:50

'' sem.Ponto, não consegue ententer strtotime()?

Ela tem 2 parâmetros, um é o time, onde você escreve o que deseja transformar para timestamp, e o segundo é opcional, onde você coloca a data de referência, claro, em timestamp.

Esta função transforma strings em inglês, então tudo que for escrever, escreva em inglês, meses, etc.
O formato de data também, YYYY-MM-DD.

Um exemplo que tem no manual:
echo strtotime("10 September 2009"), "\n";

Acima, ele irá mostrar o timestamp de quando estiver em 10/09/2009.
Se você pegar este valor gerado, e colocar na função date(), constatará isso.

Pode ser colocado horas também.
echo strtotime("10 September 2009 20:15:30"), "\n";

Sim, este mesmo o formato, HH:II:SS. O II e o SS são opcionais.
O bom desta função é que ela é bem lógica, por exemplo:

Quero ver o timestamo daqui 2 semanas:
echo strtotime("+2 weeks");

Quero ver o timestamp daqui 1 ano:
echo strtotime("+1 year");

Quero ver o timestamp daqui 2 horas:
echo strtotime("+2 hours");

Não se esqueça de trabalhar no plural, caso for necessário.


Tem que usar a função strtotime() para fazer isso, não? ponder.gif


Depende, tem que saber se ele está trabalhando com timestamp.
Se não estiver, acho que tem funções nativas do MySQL que podem ajudar ele.
Acho que quem poderia ajudar melhor, seria o boirok.

Até mais!

Edição feita por: Dudu, 25/01/2009, 16:53.

Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Moderador


Twitter: HostCheap


#5 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 25/01/2009, 19:23

Show de bola, Dudu! :D

Gostei bastante dessa função, ajuda muito. Essa função transforma a string em inglês para timestamp, mas e para transformar de volta?

o segundo é opcional, onde você coloca a data de referência, claro, em timestamp

O segundo valor serve para quê?

Depende, tem que saber se ele está trabalhando com timestamp.

Ele poderia fazer o cálculo assim que o expediente acaba, assim ele pode registrar tempo no banco de dados de uma vez.
att,
Muller Dias
ex-administrador Fórum WMO

#6 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 25/01/2009, 20:43

Ele poderia fazer o cálculo assim que o expediente acaba, assim ele pode registrar tempo no banco de dados de uma vez.


é que pelo que o gráfico dele mostra o expediente pode começar e acabar/pausar várias vezes no mesmo dia.

;)

Acho que o caminho pode ser com SUM e/ou TIMEDIFF :huh:

Mas para isso a estrutura das tabelas deve estar bem disposta, creio euAté mais

#7 Dudu

Dudu

    Viva la vida

  • Usuários
  • 1437 posts
  • Sexo:Masculino
  • Localidade:Uberlândia - MG
  • Interesses:PHP

Posted 25/01/2009, 21:23

O segundo valor serve para quê?


Bom, o segundo parâmetro é a referência.
Por exemplo, se eu deixar ele em branco, a função executa em tempo real.

Se eu colocar por exemplo:
echo strtotime("+2 days", strtotime("+1 day"));

O que isso fará?
Ele contará 2 dias do próximo dia, ou seja, daqui 3 dias.

O segundo parâmetro deve ser preenchido com algum timestamp. Se for deixado em branco, atuará como timestamp atual.

Até mais ^_^

Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Moderador


Twitter: HostCheap


#8 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 25/01/2009, 22:43

teorias já andei a mexer com elas...e mt pelo o google...precisava era de exemplos de codigos de como fazer e aprender ;)
mas para explicar melhor o problema:

funciona assim:

clico no pica e saca a hora do pc...e depois clico no entra e envia a hora para a base de dados (apenas a horas de entrada claro, a hora de saida envia nada, mas na base de dados aparece 00:00:00, n sei pq)

e depois qd for para sair clico no pica pra sacar a hora do sistema e clico no sair e guarda a hora na base de dados (apenas a hora de saida, a hora de entrada fica a 00:00:00)

Vai aqui uma screen para entender melhor:
Posted Image

a questao é q pra entrar e pra sair uso o mesmo action insert.php
é errado?

#9 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 26/01/2009, 01:37

Não tenho bola de cristal, mas pelo visto quando você envia o 'form', o campo do 'form' que está em branco está atualizando o campo referente na tabela com "NADA" e sendo assim ele assume o valor padrão para o tipo que foi definido para tal campo no banco de dados. O tipo do teu campo no banco de dados possivelmente deve estar definido para TIME ou DATETIME correto??
Se assim for... o valor padrão para time por exemplo é 00:00:00

... por isso que ele redefine para o valor padrão no campo relacionado ao campo do 'form' que foi em branco...

entendeu ???

Enfim... como eu disse, não tenho bola de cristal e por isso fiz suposições, se você colar a query que você utiliza para inserir/atualizar tua tabela, seria de grande ajuda, principalmente para você mesmo.

Teoria é a alma...

uma boa teoria evita problemas deste tipo depois...

Ficamos no aguardo então

(y)Até mais

#10 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 26/01/2009, 09:08

certo Cab...
mas como faço para inserir ou fazer o update das duas datas no meu registo?
(qd clico no botao entre e sai em tempos diferentes)
para ficar:

nome || entra || sai
--------------------------------------
kaka || 12:00:10 || 12:10:45

#11 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 26/01/2009, 14:49

Bom... acho que REPLACE resolveria, pois assim ele atualizaria os dados dos campos que foram enviados e deixaria como está os campos que não foram enviados.

Uma forma tbm seria verificar o que tem valor enviado pelo form... e só atualizar o campo que veio algum value diferente de vazio usando UPDATE

Mas o ideal seria vc colar no próximo post a query que vc está usando para analisarmos uma forma de otimizar ela.

Talvez alguém que manje bem de mysql possa ajudar vendo a query que está utilizando...

(y) Até mais

#12 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 26/01/2009, 15:54

a query q uso para inserir as horas na base de dados é esta:

$sql="INSERT INTO persons (nome, semana, dia, mes, ano, turno, entra, sai) VALUES ('$_POST[nome]', '$_POST[semana]','$_POST[dia]', '$_POST[mes]', '$_POST[ano]', '$_POST[turno]', '$_POST[entra]', '$_POST[sai]')";


onde teria de mudar para que ficasse no mesmo registo, hora de entrada e hora de saida? (pra poder fazer a diferença de horas correctamente!)

#13 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 26/01/2009, 16:34

Foi você que fez este código?
Se foi você, me responda...
Você não conseguiu entender o que eu falei no post anterior?

Porque eu praticamente mastiguei para você :D

Vamos denovo...

Você precisa saber quais campos do form estão vindo em branco

Exemplificando vamos dizer que o campo 'sai' veio em branco... então se trata de uma nova inserção (INSERT)... pois o campo 'entra' está vindo preenchido

Sabe-se quando você da um INSERT em uma tabela e esta possui um campo AUTOINCREMENT ( espero que esteja usando um) é gravado neste campo um valor numérico de forma crescente e dinâmica de acordo com a sequência a seguir e assim consecutivamente.

Bom...
Então deverá fazer com que ao meliante der entrada, o valor autoincrement daquela entrada possa ser usado

Exemplo

O cara 'entrou' e gerou uma inserção, gravou no bd a hora de entrada e deixando a hora de saída com o valor padrão que sabe-se que é 00:00:00 e gerando o valor autoincrement desta inserção tbm... entenda isso como um ID da inserção ... certo até aqui?

$sql="INSERT INTO persons 
				   (nome, semana, dia, mes, ano, turno, entra) 
				  VALUES 
				   ('".$_POST[nome]."', '".$_POST[semana]."','".$_POST[dia]."', '".$_POST[mes]."', '".$_POST[ano]."', '".$_POST[turno]."', '".$_POST[entra]."')";

// nãop precisa colocar o $_POST['sai'], e assim ele mantém o valor padrão dele que é 00:00:00

Continuando... Pode atribuir este ID para uma variável para usarmos depois, na hora de sair

Então após a inserção já defina o valor da variável $id

$id = mysql_insert_id();

Quando o meliante for sair a query não vai mais ser INSERT e sim UPDATE e atualizará apenas o campo 'sai' atribuindo a hora de saida em relação ao $id

$sql = mysql_query("UPDATE tabela SET sai = '".$sai."' WHERE id = ".$id."") or die(mysql_error());

Mas como saber se esta na hora de usar a query de UPDATE ou INSERT ??

Basta verificar os campos que estão vindo do form ou até se o $id está definido, pois se está é porque se trata de uma saída.

Quando o mesmo meliante voltar a entrar é gerado uma nova entrada e um novo ID e quando sair vai ser atualizado em relação ao novo id e assim consecutivamente

Sacou???

Se não diz aí que eu mastigo mais ¬¬

(y)Até mais

#14 Wallace Locus

Wallace Locus

    Turista

  • Usuários
  • 29 posts
  • Sexo:Não informado

Posted 26/01/2009, 21:02

entendi mais ou menos Crab, mas ainda nao funciona.

agora aparece:

nome || entra || sai
---------------------------
kaka ||13:00:00 ||
kaka ||00:00:00 ||



tenho assim no insert.php (onde anda mal?)

<?php

$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("my", $con);

$sql="INSERT INTO persons (nome, semana, dia, mes, ano, turno, entra)VALUES ('".$_POST[nome]."', '".$_POST[semana]."','".$_POST[dia]."', '".$_POST[mes]."', '".$_POST[ano]."', '".$_POST[turno]."', '".$_POST[entra]."')";
$id = mysql_insert_id();

if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}

$sql = mysql_query("UPDATE persons SET sai = '".$sai."' WHERE personID = '".$id."' ") or die(mysql_error());

echo "<p class='alert'>Pica efectuado! Tenha um bom dia! Nao se esqueca fazer logout!</p>";
echo "<center><a href='index.php'>voltar</a></center>";

mysql_close($con)

?>


Edição feita por: Wallace Locus, 26/01/2009, 21:07.


#15 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 27/01/2009, 01:31

o campo 'entra' e o campo 'sai' no banco de dados está de que tipo??? TIME ???

Tenta assim

<?php

if (!isset($_SESSION[id])){

   $sql="INSERT INTO persons 
			   (nome, semana, dia, mes, ano, turno, entra) 

			VALUES 
			   ('".$_POST[nome]."', '".$_POST[semana]."','".$_POST[dia]."', '".$_POST[mes]."', '".$_POST[ano]."', '".$_POST[turno]."', '".$_POST[entra]."')";

   $query = mysql_query($sql) or die(mysql_error());

   $_SESSION[id] = mysql_insert_id();

}
else {

   $sql = "UPDATE persons SET sai = '".$sai."' WHERE personID = '".$_SESSION[id]."'";

   $query = mysql_query($sql) or die(mysql_error());

}

?>

No topo da página deve colocar session_start();
Se estiver trabalhando com include dentro de uma index... então session_start(); deverá estar no topo da index.php.

Será que assim vai funcionar :huh:Até mais




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq