Conversão Unix para datetime

SQL Server

02/12/2014

Prezados
Amigos,

Possuo aqui na empresa um sistema de abertura de chamados e a chefia me pediu alguns relatórios mensais. analisando melhor a estrutura do banco, eu descobri que em todos os campos que deveriam ser do tipo datetime, eles são do tipo INT e os dados são gravados em formato Unix, então uma consulta em um campos deste o resultado é: 1031857200.

Até ai tudo bem, eu consigo transformar esse número em uma data legível conforme abaixo, porém a minha dúvida é: Como faço para o resultado abaixo vir em formato de data brasileiro?

SELECT
DATEADD(hh,-2,DATEADD(SS, open_date, '19700101')) >='2014-12-02 00:00:00'

Resultado:
2014-12-02 09:26:09.000

Sendo que o resultado desejado é:
02-12-2014 09:26:09

Como eu faço esta conversão?
Lucas Souza

Lucas Souza

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

02/12/2014

Olá Lucas!
Talvez você consiga utilizar a função CONVERT(). Veja o uso dela nesse link [url]http://www.w3schools.com/sql/func_convert.asp[/url]
GOSTEI 0
Isaac Jose

Isaac Jose

02/12/2014

boa tarde.. a todos.
lucas e possivel fazer essa montagem atravez de SUBSTRING. a DATA que eu tenho em uma base por exemplo esta como 17-Nov-2014 como é um campo de busca e com intuito de boas praticas eu o divido em tres .. campo dia, campo mes, campo ano. coloco tambem no inicio dos campo o seu valor com isso ao ver os mesmo ja sei qual é o mais adequado para a busca e saber o tamanho de cada um no exato momento da consulta...
segue exemplo de substring

update a
set tintMes = CASE WHEN SUBSTRING (DATA , 4,3 ) = 'JAN' then 1
WHEN SUBSTRING (DATA , 4,3 ) = 'FEV' then 2
WHEN SUBSTRING (DATA , 4,3 ) = 'MAR' then 3
WHEN SUBSTRING (DATA , 4,3 ) = 'ABR' then 4
WHEN SUBSTRING (DATA , 4,3 ) = 'MAI' then 5
WHEN SUBSTRING (DATA , 4,3 ) = 'JUN' then 6
WHEN SUBSTRING (DATA , 4,3 ) = 'JUL' then 7
WHEN SUBSTRING (DATA , 4,3 ) = 'AGO' then 8
WHEN SUBSTRING (DATA , 4,3 ) = 'SET' then 9
WHEN SUBSTRING (DATA , 4,3 ) = 'OUT' then 10
WHEN SUBSTRING (DATA , 4,3 ) = 'NOV' then 11
WHEN SUBSTRING (DATA , 4,3 ) = 'DEZ' then 12
END
from schema.tabela a
go
update a
set bintAno = CASE WHEN SUBSTRING (DATA , 8,2 ) = 14 then 2014
WHEN SUBSTRING (DATA , 8,2 ) = 15 then 2015
END
from schema.tabela a
go
update a
set tintDia = SUBSTRING ( Data ,1 , 2 )
from schema.tabela a


espero que ajude..

att

Isaac
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

02/12/2014

Lucas, conseguiu fazer a conversão?
GOSTEI 0
Lucas Souza

Lucas Souza

02/12/2014

Olá Marisiana,

Até o momento não!
Via "Convert" eu consigo fazer a data ficar em padrão nacional, porém ele não me traz a hora. Quanto a ideia do Isaac, eu não achei uma boa ideia por que eu teria de utilizar Updates.

Estou pensando em um modo de criar uma User Function para isto.


Obrigado.
Lucas
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

02/12/2014

Mas ali tem um exemplo, serve para converter a data e trazer a hora também...
131	 ->  dd/mm/yy hh:mi:ss:mmmAM
CONVERT(VARCHAR(24),GETDATE(),131 )
GOSTEI 0
Lucas Souza

Lucas Souza

02/12/2014

Sim Marisiana,

Mas convertendo desta forma o resultado que sai pra mim é:

11/02/1436 10:42:02:000A

E sem a conversão sai assim: 2014-12-03 10:42:02.000

Por que se ele estivesse trazendo a parte do ano corretamente, eu poderia refinar o resultado usando REPLACE.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

02/12/2014

Eu não utilizo SQLServer, mas pelo que vi nas pesquisas que fiz, pode conseguir obter o resultado desejado se utilizar o CAST ou o CONVERT.
[url]http://msdn.microsoft.com/pt-br/library/ms187928.aspx[/url]
GOSTEI 0
Lucas Souza

Lucas Souza

02/12/2014

Pois é Marisiana,

Via CAST/CONVERT não vai não, estou tentando uma solução mais "ninja" via User-Function mesmo. Dando certo eu posto aqui o resultado.


Obrigado!
Lucas
GOSTEI 0
Isaac Jose

Isaac Jose

02/12/2014

Olá Marisiana,

Até o momento não!
Via "Convert" eu consigo fazer a data ficar em padrão nacional, porém ele não me traz a hora. Quanto a ideia do Isaac, eu não achei uma boa ideia por que eu teria de utilizar Updates.

Estou pensando em um modo de criar uma User Function para isto.


Obrigado.
Lucas




Boa tarde a todos, Lucas não falei para voce fazer Update o que eu tinha de bate pronto era esse exemplo. o SUBSTRING permite que vc pegue partes da informação e com isso vc pode montar na ordem que quizer ..
segue exemplos com uma data que tenho e cada parte que pego dela.

SELECT TOP 1 SUBSTRING(DATA,1,2) DIA, DATA from producao.Tb_AcumProd_PFPJ
SELECT TOP 1 SUBSTRING(DATA,4,3) MES ,DATA from producao.Tb_AcumProd_PFPJ
SELECT TOP 1 SUBSTRING(DATA,8,2) ANO ,DATA from producao.Tb_AcumProd_PFPJ

resultados
DIA DATA
28 28-Nov-14

MES DATA
Nov 28-Nov-14

ANO DATA
14 28-Nov-14

com isso é so vc colocar em Subselects na order que vc quer e pronto.
espero que ajude.
GOSTEI 0
Lucas Souza

Lucas Souza

02/12/2014

Eu entendi Isaac eu entendi o seu exemplo,

Mas e quanto as horas!? Por que fazendo desta forma eu consigo montar a data, mas a hora se perde.
GOSTEI 0
Isaac Jose

Isaac Jose

02/12/2014

Eu entendi Isaac eu entendi o seu exemplo,

Mas e quanto as horas!? Por que fazendo desta forma eu consigo montar a data, mas a hora se perde.


Lucas o substring pega a posição do campo. nao importa se é data, minu,segundo, caracter especial...

seus resultados
Resultado:
2014-12-02 09:26:09.000

SELECT TOP 1 SUBSTRING(DATA,posição inicial,tamanho) ANO ,DATA from producao.Tb_AcumProd_PFPJ
SELECT TOP 1 SUBSTRING(DATA,8,2) ANO ,DATA from producao.Tb_AcumProd_PFPJ

Sendo que o resultado desejado é:
02-12-2014 09:26:09.

é so vc ir fazendo isso tirando os Espaços , - , : e montar do jeito que deseja.
GOSTEI 0
Lucas Souza

Lucas Souza

02/12/2014

Olá pessoal,

Consegui resolver o problema, resolvi de uma forma bem "tosca" e não me orgulho nem um pouco disto, mas eu resolvi!

A solução veio da forma mais simples possível, eu usei o "CONVERT" para tratar a data e concatei com o mesmo campo tratando também com CONVERT a hora. Certamente existem formas mais inteligentes de se fazer este procedimento. Segue abaixo a solução!

CONVERT(CHAR(5),DATEADD(hh,-2,DATEADD(ss, open_date, '19700101')),103) + ' ' + CONVERT(CHAR(10),DATEADD(hh,-2,DATEADD(ss, open_date, '19700101')),108) [DT_ABERTURA],

CONVERT(CHAR(5),DATEADD(hh,-2,DATEADD(ss, close_date, '19700101')),103) + ' ' + CONVERT(CHAR(10),DATEADD(hh,-2,DATEADD(ss, open_date, '19700101')),108) [DT_FECHAMENTO],

Obrigado mesmo por todo apoio.

Lucas
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

02/12/2014

Por nada!
De algum jeito tinha que dar certo...
Parabéns!
GOSTEI 0
POSTAR