Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

andreia_sp

Converter varchar pra datetime

Recommended Posts

Oi Pessoal,

 

 

bom no banco as datas estão como char (nao me critiquem porque nao fui eu que tive essa ideia!!!), e preciso ordenar isso na hora da exibiçao do relatorio.

O que acontece, ele ordena somente o dia e nao por data:

 

02/12/2007

03/03/2007

04/08/2006

04/12/2006

06/12/2006

07/06/2006

07/06/2006

Eu tentei com convert convert(varchar,data,103) mas nao acontece nada. Com o cast cast(data as datetime) aparece o erro:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

entao como fazer???

obrigada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Pessoal,

 

 

bom no banco as datas estão como char (nao me critiquem porque nao fui eu que tive essa ideia!!!), e preciso ordenar isso na hora da exibiçao do relatorio.

O que acontece, ele ordena somente o dia e nao por data:

 

02/12/2007

03/03/2007

04/08/2006

04/12/2006

06/12/2006

07/06/2006

07/06/2006

Eu tentei com convert convert(varchar,data,103) mas nao acontece nada. Com o cast cast(data as datetime) aparece o erro:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

entao como fazer???

obrigada

 

Princesa,

 

Data é dose. Se precisar manipula hora então ai que é osso msm.

 

Vou prepara um tuto sobre datas no SQL e postarei breve.

 

Bom tenta assim:

CREATE TABLE #TMP (DAT VARCHAR(10))INSERT INTO #TMP (DAT) VALUES ('02/12/2007')INSERT INTO #TMP (DAT) VALUES ('03/03/2007')INSERT INTO #TMP (DAT) VALUES ('04/08/2006')INSERT INTO #TMP (DAT) VALUES ('04/12/2006')INSERT INTO #TMP (DAT) VALUES ('06/12/2006')INSERT INTO #TMP (DAT) VALUES ('07/06/2006')INSERT INTO #TMP (DAT) VALUES ('07/06/2006')SELECT * FROM #TMP ORDER BY CONVERT(DATETIME,DAT)DROP TABLE #TMP

Acho que vai resolver.

 

 

Segue um exemplo no uso do convert para datas só por curiosidade:

select convert(varchar(12),getdate(),101) as '101',convert(varchar(12),Getdate(),102) as '102',convert(varchar(12),Getdate(),103) as '103',convert(varchar(12),Getdate(),104) as '104',convert(varchar(12),Getdate(),105) as '105',convert(varchar(12),Getdate(),106) as '106',convert(varchar(12),Getdate(),107) as '107',convert(varchar(12),Getdate(),108) as '108',convert(varchar(12),Getdate(),109) as '109',convert(varchar(12),Getdate(),110) as '110',convert(varchar(12),Getdate(),111) as '111',convert(varchar(12),Getdate(),112) as '112',convert(varchar(12),Getdate(),113) as '113',convert(varchar(12),Getdate(),114) as '114',convert(varchar(12),Getdate(),120) as '120',convert(varchar(12),Getdate(),121) as '121'
QQ dúvida posta ai!

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

jothaz, obrigada pela sua atenção. Vai ficar inviavel criar outra tabela... bom a forma que eu encontrei aqui foi:

 

select cast(substring('28/02/2007',7,10) + '-' + substring('28/11/2007',4,2) + '-' + substring('28/02/2007',1,2) as datetime)

 

existe alguma desvantagem de fazer isso? fora de ser uma baita gambi ne... rsss

Compartilhar este post


Link para o post
Compartilhar em outros sites

jothaz, obrigada pela sua atenção. Vai ficar inviavel criar outra tabela... bom a forma que eu encontrei aqui foi:

 

select cast(substring('28/02/2007',7,10) + '-' + substring('28/11/2007',4,2) + '-' + substring('28/02/2007',1,2) as datetime)

 

existe alguma desvantagem de fazer isso? fora de ser uma baita gambi ne... rsss

afff... q "RTA"

 

qdo, tu fez isso:

convert(varchar,data,103)

 

setou antes a conexão para usar DMY ?

SET DATEFORMAT DMY

Compartilhar este post


Link para o post
Compartilhar em outros sites

jothaz, obrigada pela sua atenção. Vai ficar inviavel criar outra tabela... bom a forma que eu encontrei aqui foi:

 

select cast(substring('28/02/2007',7,10) + '-' + substring('28/11/2007',4,2) + '-' + substring('28/02/2007',1,2) as datetime)

 

existe alguma desvantagem de fazer isso? fora de ser uma baita gambi ne... rsss

Princesa,

 

Acho que me expressei mal! http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

 

Você não precisa criar um tabela temporária. Eu crie para facilitar a ajuda e para que se algum outro forista quisesse testar ficava fácil a massa de teste já esta pronta e cola/copiar no QA e rodar.

 

A expressão seria:

SELECT * FROM #TMPORDER BY CONVERT(DATETIME,DAT)
O que vai ordernar é ORDER BY CONVERT(DATETIME,DAT) qué é basicamente o que você fez só que sem montar a data.

 

As duas formas funcionam agora cabe a você decidir qual lhe agrada mais. A sugestão que apresentei fica mais clara e simples.

 

Então basta você decidir qual usar.

 

Em próxima oportunidade seria mais claro! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eriva o que é "RTA"??

 

jothaz rapaz.... eu sei que nao vou pro ceu, mas aquilo do substring tava funcionando heheheheh, mas claro que sua opçao é a melhor.. no primeiro teste funcionou... vou testar o resto

 

obrigaduuuuuuu

=***

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eriva o que é "RTA"??

 

jothaz rapaz.... eu sei que nao vou pro ceu, mas aquilo do substring tava funcionando heheheheh, mas claro que sua opçao é a melhor.. no primeiro teste funcionou... vou testar o resto

 

obrigaduuuuuuu

=***

Pois e eriva_br o que é "RTA"?

 

Doce andreia_sp todos aqueles que se arrependerem de seus códigos imperfeitos serão comtemplados com as delicias celestiais. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Não sou purista e se esta funcionando e o usuário feliz então tá bão!

 

E os post´s são para isso mesmo! Se ter várias visões de uma mesma situação.

 

E agradeço principalmente o feedback de que se a respostas serviu ou não.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

A resposta do eriva nao deu certo, nao deu erro mas ficou na mesma coisa que eu disse la em cima... ordena por texto.

 

Nao deu certo a tua tb jothaz =(... ele aparece o erro :

 

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

 

 

ainda... a minha tranquilidade é que a gambi funciona perfeitamente!!! kkkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

A resposta do eriva nao deu certo, nao deu erro mas ficou na mesma coisa que eu disse la em cima... ordena por texto.

 

Nao deu certo a tua tb jothaz =(... ele aparece o erro :

 

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

 

 

ainda... a minha tranquilidade é que a gambi funciona perfeitamente!!! kkkkk

Engraçado não funcionar o que postei pois rodei aqui e deu tudo certo! Por isso criei a tabela temporária para ter certeza q a resposta esta correta.

 

Todas as suas datas gravadas na sua tabela são datas validas? Com o tipo de campo não é DATETIME a consistência de data deve ser feito pela aplicação. Agora se ocorreu um desbeiço na aplicação e passou alguma data inválida ou com qq conteúdo estranho.

 

você fez todos os testes com a sua solução (gambi :lol: ) ? Por que as vezes pode esta funcionando em determinada situação e não funciona em outras. Caso você tenha certeza de que a sua solução esta ok e foi testada de forma satisfatória então deixe como esta.

 

Agora se você for curiosa poderi efetuar um teste?

Execute este comando e veja se funciona:

SELECT CONVERT(DATETIME,SUA_DATA) FROM SUA_TABELA
O comando acima simplesmente lista todos os registros da sua tabela convertando para o formato DATETIME. Teria que rodar sem problemas. Se não rodar pode ser algum data cadastrada inválida.

 

No aguardo. Positivo operante.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

mesmo erro, olhei todas as datas e nao tem nenhum invalida :(

 

 

 

p.s: ainda esperando a definicao de "RTA" rssss

Pricesa,

 

Sinistro!!

 

Qual o tamanho do campo VARCHAR onde esta sendo gravada a data? Varchar(10)?

 

Se você quiser e puder faça mais um teste:

SELECT CONVERT(SUBSTRING(DATETIME,1,10),SUA_DATA) FROM SUA_TABELA
Teste se possivel e comente o resultado.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tamanho é de 25 caracteres.

 

Erro :

Line 1: Incorrect syntax near 'DATETIME'.

Ooop´s foi mal postei a expressão errada!

 

Tenta assim:

 

SELECT CONVERT(DATETIME,SUBSTRING(SUA_DATA,1,10),SUA_DATA) FROM SUA_TABELA
Ou

SELECT CONVERT(DATETIME,RTRIM(LTRIM(SUA_DATA))) FROM SUA_TABELA
E acho que é o tamanho que esta desbeiçando a parada.

 

O dois exemplos acima tentam contorna esta problema.

 

O primeiro pega as 10 primeiras posições. O segundo usa RTRIM e LTRIM para retirar os espaços em branco.

 

Se possivel teste ai por favor.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

new error:

 

Argument data type char is invalid for argument 3 of convert function.

 

 

quem será de nós que vai enlouquecer primeiro?? rsss

Compartilhar este post


Link para o post
Compartilhar em outros sites

vortei

 

"RTA Recurso Tecnologico Alternativo"... um nome mais sensual pra nossa querida "gambi"...rssssss

 

Andreia tenta fazer o skema que o jothaz disse e setar a conexão para DMY

 

 

abraços pessoas bom fim de semana................... e um brinde a sexta-feira http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tamanho é de 25 caracteres.

 

Erro :

Line 1: Incorrect syntax near 'DATETIME'.

Ooop´s foi mal postei a expressão errada!

 

Tenta assim:

 

SELECT CONVERT(DATETIME,SUBSTRING(SUA_DATA,1,10),SUA_DATA) FROM SUA_TABELA
Ou

SELECT CONVERT(DATETIME,RTRIM(LTRIM(SUA_DATA))) FROM SUA_TABELA
E acho que é o tamanho que esta desbeiçando a parada.

 

O dois exemplos acima tentam contorna esta problema.

 

O primeiro pega as 10 primeiras posições. O segundo usa RTRIM e LTRIM para retirar os espaços em branco.

 

Se possivel teste ai por favor.

 

t+

 

Princesa,

 

O tamanho de VARCHAR(25) não compromete a conversão fiz uns teste inclusive colocando brancos antes e depois da data e consegui converter sem problemas. Então esta descartado a idéia do tamanho do campo.

 

Agora consegui reproduzir a msg de erro: The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

 

Utilizei o exemplo a seguir:

--CRIANDO MASSA PARA TESTCREATE TABLE #TMP (DAT VARCHAR(25))INSERT INTO #TMP (DAT) VALUES ('02/ 12/2007')INSERT INTO #TMP (DAT) VALUES ('03/03/2007')INSERT INTO #TMP (DAT) VALUES ('30/02/2007') -- DATA INVALIDASELECT * FROM #TMP ORDER BY CONVERT(DATETIME,DAT)DROP TABLE #TMP
Não estou desconfiando de você mas aparentemente você deve ter alguma data cadastrada que esta invalida ou com algum lixo no conteúdo dela. Talvez não seja nenhuma das datas que esta sendo retornada mas alguma na sua tabela.

 

Qtos registro têm na sua tabela? Ve consitiu as datas no olho ou rodou algum script ou programa para validá-la?

 

Faço questão de afirma que não estou duvidando da informação de q as data estão ok mas só consegui reproduzir o erro cadastrando uma data invalida.

 

No aguardo.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou fazer o seguinte... como tempo que entregar o projeto hoje, ele vai pelo RAT hehehehe.

 

em casa vou usar a mesma base de dados e fazer isso que voce está dizendo aqui até eu achar exatamente o erro.

assim que eu tiver uma resposta vou postar aqui

 

muito obrigada aos dois pela paciencia e ajuda =D

 

bom final de semana

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou fazer o seguinte... como tempo que entregar o projeto hoje, ele vai pelo RAT hehehehe.

 

em casa vou usar a mesma base de dados e fazer isso que voce está dizendo aqui até eu achar exatamente o erro.

assim que eu tiver uma resposta vou postar aqui

 

muito obrigada aos dois pela paciencia e ajuda =D

 

bom final de semana

De nada estamos as ordens.

 

Caso você possa faça o teste pq parece que tem alguma data inválida.

 

Já q vais testar em casa crie um campo do tipo DATETIME na sua base e tente gravar as datas VARCHAR nele se der erro é pq tem data invalida.

 

Qto ao RAT é perfeitamente aceitavel pois contra o tempo não têm argumento. A minha única dúvida é se realmente o RTA esta funcionando corretamente em todas as situações. Pq as vezes ele pode esta mascarando um erro ou começar a ocorrer erros intermitentes. Esta é a única ressalva.

 

Bom final de semana.

 

eriva gostei do RTA melhor que GAMBI. Bom final de semana pra você tb.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ois,

 

eu soh consegui fazer os testes hoje. Bom, eu nao consegui entender a logica do erro.

Monte uma base limpa somente com o campo data, do tipo char(25), inseri algumas datas da base verdadeira:

 

18/10/2005

19/10/2005

19/10/2005

19/10/2005

20/10/2005

apareceu o mesmo erro de sempre... achei que era o tamanho do campo e passei pra 10, mas nao mudou em nada. Bom, eu entao mudei as datas:

 

01/01/2007

01/01/2007

01/01/2007

01/01/2007

02/01/2007

e ai funcionou!! Entao adicionei a data nessa lista: 18/10/2005

Deu erro, tentei com 18/10/2007 mas tambem mesmo erro.

 

agora me expliquem... como pode se a data é valida??

 

obrigada

Compartilhar este post


Link para o post
Compartilhar em outros sites

agora me expliquem... como pode se a data é valida??

 

obrigada

Olá Andréia, td beleza?

 

sim exprico... (pelo menos vou tentar)

mas antes vamos voltar ao tempo, sexta-feira 17:55...rsssss

vortei

 

"RTA Recurso Tecnologico Alternativo"... um nome mais sensual pra nossa querida "gambi"...rssssss

 

Andreia tenta fazer o skema que o jothaz disse e setar a conexão para DMY

 

 

abraços pessoas bom fim de semana................... e um brinde a sexta-feira http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif

Note essa frase "Andreia tenta fazer o skema que o jothaz disse e setar a conexão para DMY"

 

vamos lá, disse isso pq. o sql server por padrão de instalação usa para datas o formato americano MDY (mês/dia/ano), desta forma

18/10/2007, mes 18 ele não vai achar

 

mas se mudarmos para DMY (dia/mês/ano) pradão brasileiro, dai ele vai achar....hehehe

 

usando o exemplo acima do jothaz:

SET DATEFORMAT MDY --coloquei aqui para melhor entendimento, mas por padrão qdo. abre uma conexão, já é assim--CRIANDO MASSA PARA TESTCREATE TABLE #TMP (DAT VARCHAR(25))INSERT INTO #TMP (DAT) VALUES ('02/12/2007')INSERT INTO #TMP (DAT) VALUES ('03/03/2007')INSERT INTO #TMP (DAT) VALUES ('18/10/2007') -- DATA INVALIDA, pq. estamos em MDYSELECT * FROM #TMPORDER BY CONVERT(DATETIME,DAT)DROP TABLE #TMP
vai gerar o erro

Server: Msg 242, Level 16, State 3, Line 11

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

pq. o sql entende que os dois primeiros é mês, desta forma 18 não é mês e gera o erro

 

 

mas....

se setarmos a conexão para DMY

SET DATEFORMAT dmy--CRIANDO MASSA PARA TESTCREATE TABLE #TMP (DAT VARCHAR(25))INSERT INTO #TMP (DAT) VALUES ('02/12/2007')INSERT INTO #TMP (DAT) VALUES ('03/03/2007')INSERT INTO #TMP (DAT) VALUES ('18/10/2007')  -- DATA OK, pq. agora now, estamos em DMYSELECT * FROM #TMPORDER BY CONVERT(DATETIME,DAT)DROP TABLE #TMP
não irá gerar nenhum erro, pq. agora avisamos o sql que os dois primeiros são dia, então 18 é valido

 

 

 

resumo: trabalhar com datas no sql é chato msm..rssss

 

boa semana galega,

beijos e abraços

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.