Jump to content


Photo

Diferença De Datas


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

#1 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 09/03/2006, 11:43

nossa, chega to com vergonha de perguntar uma coisa que deve ser tão fácil...


Tenho no meu db uma data futura (datetime), 2009-10-09 00:00:00 por exemplo.
Como faço pra calcular a diferença de dias entre hoje (NOW()) e esta data?

tentei usar timestamp unix mas esse cocô zera em 1900 às 21 horas...
dá uma luz aew por favor :D
PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 09/03/2006, 11:53

Já tentou usando:

CAST(((UNIX_TIMESTAMP(data) - UNIX_TIMESTAMP(NOW())) / 84600) AS SIGNED)

Também tem a função:

DATEDIFF() retorna o número de dias entre a data inicial expr e a data final expr2. expr e expr2 são expressões de datas ou data e hora. Apenas a parte da data dos valores sã usados no cálculo


Se estiver usando MySQL.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 09/03/2006, 14:48

olha minha query:

$DataBase->DoQuery("SELECT
      Oss.Id    ,
      Oss.AnexCliente  ,
      Oss.AnexRespAgencia	,
      Oss.DataIn 	 ,
      Oss.DataOut 	 ,
      Oss.Servico 	 ,
      
      MAX(Estagio.Id)	As EstagioID  ,
      Estagio.Nome	AS EstagioNome  ,
      
      Cliente.Id  AS ClienteID  ,
      Cliente.Empresa AS ClienteEmpresa	,
      
      Respons.Id  AS ResponsID  ,
      Respons.Apelido AS ResponsApelido	,
      
      ResEsta.Id  AS ResEstaID  ,
      ResEsta.Apelido	AS ResEstaApelido
      
      FROM
     	 OS_oss  AS Oss  ,
     	 OS_estagios	AS Estagio	,
     	 usuarios	AS Cliente	,
     	 usuarios	AS Respons	,
     	 usuarios	AS ResEsta
   	 WHERE
      Oss.AnexCliente  = Cliente.Id	AND
      Oss.AnexRespAgencia	= Respons.Id	AND
      Estagio.AnexOss  = Oss.Id  AND
      Estagio.AnexUsuario	= ResEsta.Id
   	 GROUP BY
      Oss.Id");


ta vendo o "Oss.DataOut"???? isso é o datetime, quero apenas que imprima assim:
"faltam 3 dias e 2 horas", onde isto é calculado a partir de hoje até DataOut.

... não entendi as aplicações práticas do CAST pra fazer isso que eu quero...
PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 09/03/2006, 23:15

nossa, chega to com vergonha de perguntar uma coisa que deve ser tão fácil...


Você exagera tanto hein! :P

Bom, se o MySQL que você está usando nos ajudar, poderá ser feito assim:
DATE_DIFF(Oss.DataOut, NOW()) AS data_diff,
CEILING(((HOUR(Oss.DataOut) * 3600) - (HOUR(NOW()) * 3600)) / 3600) AS hora_diff

data_diff -> Diferença entre as datas. (Da tabela - Dia corrente)
hora_diff -> Horas que faltam.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 goiaba2000

goiaba2000

    Tô com sono!

  • Usuários
  • 1118 posts
  • Sexo:Não informado
  • Localidade:Sobradinho-DF

Posted 14/03/2006, 15:35

olha so...
minha query ficou assim:
SELECT
      Oss.Id    ,
      Oss.AnexCliente  ,
      Oss.AnexRespAgencia	,
      Oss.DataIn 	 ,
      Oss.DataOut 	 ,
      Oss.Servico 	 ,
      
      DATEDIFF(Oss.DataOut, NOW())          AS data_diff,
      CEILING(((HOUR(Oss.DataOut) * 3600) - (HOUR(NOW()) * 3600)) / 3600)	AS hora_diff,
      
      MAX(Estagio.Id)	As EstagioId  ,
      Estagio.Nome	AS EstagioNome  ,
      
      Cliente.Id  AS ClienteID  ,
      Cliente.Empresa AS ClienteEmpresa	,
      
      Respons.Id  AS ResponsID  ,
      Respons.Apelido AS ResponsApelido	,
      
      ResEsta.Id  AS ResEstaID  ,
      ResEsta.Apelido	AS ResEstaApelido
      
      FROM
     	 OS_oss  AS Oss  ,
     	 OS_estagios	AS Estagio	,
     	 usuarios	AS Cliente	,
     	 usuarios	AS Respons	,
     	 usuarios	AS ResEsta
   	 WHERE
      Oss.AnexCliente  = Cliente.Id	AND
      Oss.AnexRespAgencia	= Respons.Id	AND
      Estagio.AnexOss  = Oss.Id  AND
      Estagio.AnexUsuario	= ResEsta.Id	AND
      Estagio.Nome  <> 'FINALIZADO'
   	 GROUP BY
      Oss.Id

mas ainda tenho uma duvida nesta parte:

MAX(Estagio.Id)	As EstagioId  ,
Estagio.Nome	AS EstagioNome  ,

Eu "pego" o maior id do estágio. OK.
Mas não vem o "nome" vinculado a este id. por exemplo, eu pego os campos 3 | blabla, mas 'blabla' está na linha do id 1, não do id 3.

deu pra entender?
PHP + UML + OO + Flash + MySQL = IMBATIVEL

http://www.guilardi.com.br
- portifólio
http://www.deusehmais.com.br
- projeto atual

#6 PlaynowGames

PlaynowGames

    12 Horas

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

Posted 14/03/2006, 17:15

olha so...
minha query ficou assim:

SELECT
      Oss.Id    ,
      Oss.AnexCliente  ,
      Oss.AnexRespAgencia	,
      Oss.DataIn  	,
      Oss.DataOut  	,
      Oss.Servico  	,
      
      DATEDIFF(Oss.DataOut, NOW())          AS data_diff,
      CEILING(((HOUR(Oss.DataOut) * 3600) - (HOUR(NOW()) * 3600)) / 3600)	AS hora_diff,
      
      MAX(Estagio.Id)	As EstagioId  ,
      Estagio.Nome	AS EstagioNome  ,
      
      Cliente.Id  AS ClienteID  ,
      Cliente.Empresa AS ClienteEmpresa	,
      
      Respons.Id  AS ResponsID  ,
      Respons.Apelido AS ResponsApelido	,
      
      ResEsta.Id  AS ResEstaID  ,
      ResEsta.Apelido	AS ResEstaApelido
      
      FROM
      	OS_oss  AS Oss  ,
      	OS_estagios	AS Estagio	,
      	usuarios	AS Cliente	,
      	usuarios	AS Respons	,
      	usuarios	AS ResEsta
    	WHERE
      Oss.AnexCliente  = Cliente.Id	AND
      Oss.AnexRespAgencia	= Respons.Id	AND
      Estagio.AnexOss  = Oss.Id  AND
      Estagio.AnexUsuario	= ResEsta.Id	AND
      Estagio.Nome  <> 'FINALIZADO'
    	GROUP BY
      Oss.Id

mas ainda tenho uma duvida nesta parte:

MAX(Estagio.Id)	As EstagioId  ,
Estagio.Nome	AS EstagioNome  ,

Eu "pego" o maior id do estágio. OK.
Mas não vem o "nome" vinculado a este id. por exemplo, eu pego os campos 3 | blabla, mas 'blabla' está na linha do id 1, não do id 3.

deu pra entender?

como seria esta contagem regressiva!!??

é o mesmo q pegar a data com o date();

pq to desenvolvendo um sistema q um serial expira e o date(), como rodaria localmente, era so o usuario mudar a data no PC....

se ffor diferente seria util pra mim!!

#7 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 14/03/2006, 17:28

Bom, se você quer obter esse id maior juntamente com o valor do campo nome correspondente, sendo estes sem ligação alguma com a expressão contida na cláusula WHERE, creio que a forma para fazer isso é adicionando a mesma tabela outra vez na consulta, claro, com outro aliase a referindo.

FROM
      OS_oss  AS Oss  ,
      OS_estagios AS Estagio ,
      OS_estagios AS Estagio2 ,
      usuarios AS Cliente ,
      usuarios AS Respons ,
      usuarios AS ResEsta
WHERE
    Oss.AnexCliente  = Cliente.Id AND
    Oss.AnexRespAgencia = Respons.Id AND
    Estagio.AnexOss  = Oss.Id  AND
    Estagio.AnexUsuario = ResEsta.Id AND
    Estagio.Nome  <> 'FINALIZADO' AND
    Estagio2.id = MAX(Estagio2.id)


E na lista de campos no SELECT, você coloca:
Estagio2.nome AS EstagioNome

Tente assim irmão, creio que esteja correto.
[]'s
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29




1 user(s) are reading this topic

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

IPB Skin By Virteq