ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Campo Varchar guardando Datas

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
corohsnk
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 27 de Janeiro de 2012
Mensagens: 176

MensagemEnviada: Ter Jul 22, 2014 3:42 pm    Assunto: Campo Varchar guardando Datas Responder com Citação

Amigos, um cidadão brasileiro que trabalhava onde estou trabalhando no momento criou no banco de dados do sistema um campo VARCHAR para guardar datas e agora o cliente pediu um relatorio que preciso desse campo , por ser VARCHAR quando eu faço( campo >= '31/12/2013' and campo <= '31/12/2014') o sistema puxa muitos registro até registro que nao tem essas datas, eu entendo que por ser varchar ele nao calcule direito, enfim, estou tentando utilizar o Cast porem no banco o registro está assim '31/12/2013' e quando uso cast(dataprodutos as Date) = '11/11/2011' ele da erro pois tem que ser '11.11.2011' com ponto final e nao com barra, alguem poderia me ajudar?, ja tentei com CONVERT tambem mas não funcionou
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 22, 2014 3:57 pm    Assunto: Responder com Citação

Boa tarde,

Se o banco de dados for o Firebird versão 2.1 ou mais recente, experimente adicionar a função Replace para trocar as barras por pontos:

Código:
cast(replace(dataprodutos, '/', '.') as Date)


O problema do Cast é que vai ocorrer um erro se houver algum registro com uma data inválida (ex: 30.02.2014)

Espero que ajude.


Editado pela última vez por imex em Qua Mar 08, 2023 11:59 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
corohsnk
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 27 de Janeiro de 2012
Mensagens: 176

MensagemEnviada: Ter Jul 22, 2014 4:02 pm    Assunto: Responder com Citação

nossa nem tinha pensando no replace, ajudou e muito , agora existe mais 1 problema , as datas estão salvas assim DD/MM/YYYY, e para que funcione pede assim YYYY/MM/DD, tem algum comando que inverta isso?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
souzacruz001
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 11 de Junho de 2014
Mensagens: 273

MensagemEnviada: Ter Jul 22, 2014 4:02 pm    Assunto: Responder com Citação

Boa tarde.

Eu já tive esses mesmo problema durante uma migração, o campo também era VARCHAR.

O banco de dados era Oracle, então eu fazia a copia das partes da data, por exemplo:

Código:

select cast(dia || '.' || mes || '.' || ano as date) as data from (

select SUBSTR('01/01/2012', 1, 2) as dia, SUBSTR('01/01/2012', 4, 2) as mes, SUBSTR('01/01/2012', 7, 4) as ano from sua_tabela )


No Oracle, para fazer um Copy utiliza o "SUBSTR", no PostgreSQL e Firebird usa o "substring'. Se o seu banco for diferente, basta pesquisar na documentação.

Esperto ter ajudado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Jul 22, 2014 4:03 pm    Assunto: Responder com Citação

Passei pela mesma situação na empresa onde trabalho.

Comigo funcionou o "Convert" no SQL.

Código:

Select NomeUsu, Convert(Char(10), DataLog,103) As DataLog,
EstaLog, AtivLog, Convert(Char(8), HoraLog, 8) As HoraLog From AsccAtiv


Segue uma tabela para conversão e os modos de saída:

Código:

select convert(char, getdate(), 100) --mon dd yyyy hh:mmAM (or PM)
 
select convert(char, getdate(), 101) --mm/dd/yyyy
 
select convert(char, getdate(), 102) --yyyy.mm.dd
 
select convert(char, getdate(), 103) --dd/mm/yyyy
 
select convert(char, getdate(), 104) --dd.mm.yyyy
 
select convert(char, getdate(), 105) --dd-mm-yyyy
 
select convert(char, getdate(), 106) --dd mon yyyy
 
select convert(char, getdate(), 107) --mon dd, yyyy
 
select convert(char, getdate(), 108) --hh:mm:ss
 
select convert(char, getdate(), 109) --mon dd yyyy hh:mm:ss:mmmAM (or PM)
 
select convert(char, getdate(), 110) --mm-dd-yyyy
 
select convert(char, getdate(), 111) --yyyy/mm/dd
 
select convert(char, getdate(), 112) --yyyymmdd
 
select convert(char, getdate(), 113) --dd mon yyyy hh:mm:ss:mmm
 
select convert(char, getdate(), 114) --hh:mm:ss:mmm(24h)
 
select convert(char, getdate(), 120) --yyyy-mm-dd hh:mm:ss(24h)
 
select convert(char, getdate(), 121) --yyyy-mm-dd hh:mm:ss.mmm


_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
corohsnk
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 27 de Janeiro de 2012
Mensagens: 176

MensagemEnviada: Ter Jul 22, 2014 4:05 pm    Assunto: Responder com Citação

Estou utilizando Firebird 2.1

natanbh1 não sei porq mas quando uso

select convert(char, getdate(), 103) ele apresenta erro na virgual depois do CHAR
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Jul 22, 2014 4:06 pm    Assunto: Responder com Citação

Qual a mensagem de erro ?
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
corohsnk
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 27 de Janeiro de 2012
Mensagens: 176

MensagemEnviada: Ter Jul 22, 2014 4:08 pm    Assunto: Responder com Citação

Citação:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 42.
,.


select * from produtos where convert(date, dataprodutos,103) = '19/07/2013'
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Jul 22, 2014 4:13 pm    Assunto: Responder com Citação

Neste seu exemplo, troque "date" por "Char(10)".
Entre parenteses do char coloque o tamanho do seu campo string.

Código:


select * from produtos where convert(Char(10), dataprodutos, 103) = '19/07/2013'


_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
corohsnk
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 27 de Janeiro de 2012
Mensagens: 176

MensagemEnviada: Ter Jul 22, 2014 4:15 pm    Assunto: Responder com Citação

da este erro

Citação:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 40.
char.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 22, 2014 4:31 pm    Assunto: Responder com Citação

corohsnk escreveu:
nossa nem tinha pensando no replace, ajudou e muito , agora existe mais 1 problema , as datas estão salvas assim DD/MM/YYYY, e para que funcione pede assim YYYY/MM/DD, tem algum comando que inverta isso?


Pelo que vi se você utilizar o ponto como separador o formato esperado é 'DD.MM.YYYY':
http://www.firebirdfaq.org/faq137/

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Jul 22, 2014 4:46 pm    Assunto: Responder com Citação

Desculpe, agora vi no seu outro post o BD que você usa.
O Convert não funciona no Firebird. Tente usar o Cast mesmo.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB