none
CONVERTER VARCHAR PARA FORMATO DATA RRS feed

  • Pergunta

  • Olá Pessoal,

    Preciso fazer pesquisar resultados com data anterior a 30 dias. Ex. deve pegar a data atual - 30 dias e mostras os dados que estão nesse filtro. Encontrei um exemplo só que não deu certo porque no meu banco o campo "data" foi definido como varchar (não fui eu quem definiu), como posso converter o campo data para que ele faça a consulta?

    SELECT *

    FROM tabela

    WHERE data BETWEEN CURRENT_DATE()-30 AND CURRENT_DATE()

     

    --BETWEEN retorna o que há entre essas datas.

    --CURRENT_DATE() retorna a data atual.

    --CURRENT_DATE()-30 retorna a data atual, menos sete dias.

    sexta-feira, 23 de janeiro de 2015 13:04

Respostas

  • Bom dia,

    Siga este exemplo, como você pode ver a data é um varchar, da mesma maneira que você questiona.

    declare @tabela TABLE (data varchar(20))
    
    insert into @tabela values('2015-01-01')
    insert into @tabela values('2014-01-01')
    
    
    SELECT *
    FROM @tabela
    WHERE data BETWEEN GETDATE()-30 AND GETDATE()

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    • Marcado como Resposta Leandro HG sexta-feira, 23 de janeiro de 2015 13:35
    sexta-feira, 23 de janeiro de 2015 13:26

Todas as Respostas

  • Leandro,

    Já pensou em utilizar as funções DateAdd ou Getdate?

    Veja estes simples exemplos:

    Select * from Tabela
    Where Data = GetDate()-30
    
    --------------------------------------
    
    Select * from Tabela
    Where Data = DateAdd(d,-30,GetDate())


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 23 de janeiro de 2015 13:08
  • Bom dia,

    Siga este exemplo, como você pode ver a data é um varchar, da mesma maneira que você questiona.

    declare @tabela TABLE (data varchar(20))
    
    insert into @tabela values('2015-01-01')
    insert into @tabela values('2014-01-01')
    
    
    SELECT *
    FROM @tabela
    WHERE data BETWEEN GETDATE()-30 AND GETDATE()

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    • Marcado como Resposta Leandro HG sexta-feira, 23 de janeiro de 2015 13:35
    sexta-feira, 23 de janeiro de 2015 13:26
  • Eita...já tinha visto essas funções e não me lembrava. Fiz a alteração mas não traz nada, verifiquei no banco e existe um registro com data de 21/01/2015. Ele deveria mostrar já que o filtro está em Where Data = GetDate()-30, tem algo a ver pelo campo ser um varchar?

     
    sexta-feira, 23 de janeiro de 2015 13:33
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sexta-feira, 23 de janeiro de 2015 13:35
    Moderador
  • Isso mesmo funcionou direitinho, obrigado!

    sexta-feira, 23 de janeiro de 2015 13:35
  • ok, já que a data está no formato dd/MM/yyyy então pode fazer da seguinte maneira, não muda muito:

    declare @tabela TABLE (data varchar(20))
    
    insert into @tabela values('21/01/2015')
    insert into @tabela values('21/01/2014')
    
    
    SELECT *
    FROM @tabela
    WHERE CONVERT(DATETIME, data, 103) BETWEEN GETDATE()-30 AND GETDATE()

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    sexta-feira, 23 de janeiro de 2015 13:36
  • Obrigado Durval, 

    Estarei estudando um meio de realizar essa alteração.

    sexta-feira, 23 de janeiro de 2015 14:11
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 23 de janeiro de 2015 17:03
  • ok, já que a data está no formato dd/MM/yyyy então pode fazer da seguinte maneira, não muda muito:

    declare @tabela TABLE (data varchar(20))
    
    insert into @tabela values('21/01/2015')
    insert into @tabela values('21/01/2014')
    
    
    SELECT *
    FROM @tabela
    WHERE CONVERT(DATETIME, data, 103) BETWEEN GETDATE()-30 AND GETDATE()

    **************************************************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    Tks.

    Demetrius,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?



    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 23 de janeiro de 2015 17:03
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Junior,

    Como informei para o Leandro, manter os dados com um datatype "texto"(varchar,char,...) poderá gerar diversos problemas, além de perda de dados.

    Certamente, a conversão de dados na clausula WHERE poderá gerar lentidão nas consultas desta tabela, mas vai garantir o retorno dos dados "com menor possibilidade" de perda de informações do que a alternativa proposta (e "marcada como resposta").

    Veja abaixo uma pequena demonstração:

    CREATE TABLE TB_PESSOA (
    CD_PESSOA			int			NOT NULL,
    DT_NASCIMENTOTXT	varchar(10)	NOT NULL
    ) 
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (1, '27/01/2015')
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy") "MAS COM ESPAÇO COMO SUJEIRA"
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (2, '27/01/2015 ')
    GO
    
    --DATA VÁLIDA (formato "d/M/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (3, '27/1/2015')
    GO
    
    -- CONSULTA COM CONVERSÃO (COMO INDIQUEI)
    SELECT * FROM TB_PESSOA
    WHERE CONVERT(datetime, DT_NASCIMENTOTXT , 103) BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO
    
    --OUTRA CONSULTA (SEM CONVERSÃO)
    SELECT * FROM TB_PESSOA
    WHERE DT_NASCIMENTOTXT BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO

    Segue abaixo os print-screen's como "Evidência de Testes":

    COM CONVERSÃO NA CLÁUSULA "WHERE":

    "SEM" CONVERSÃO DE DADOS:

    Como você pode ver nesta demonstração, a conversão é "implícita" e como não há um padrão definido dos dados, ocorre o erro.

    Não quero denegrir a ajuda de ninguém, apenas esclarecer que poderá ocorrer "perda de informações" nas consultas do Leandro e dependendo da necessidade e criticidade do sistema, a perda de informações pode não ser tolerada.

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 27 de janeiro de 2015 18:52
    Moderador
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Junior,

    Como informei para o Leandro, manter os dados com um datatype "texto"(varchar,char,...) poderá gerar diversos problemas, além de perda de dados.

    Certamente, a conversão de dados na clausula WHERE poderá gerar lentidão nas consultas desta tabela, mas vai garantir o retorno dos dados "com menor possibilidade" de perda de informações do que a alternativa proposta (e "marcada como resposta").

    Veja abaixo uma pequena demonstração:

    CREATE TABLE TB_PESSOA (
    CD_PESSOA			int			NOT NULL,
    DT_NASCIMENTOTXT	varchar(10)	NOT NULL
    ) 
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (1, '27/01/2015')
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy") "MAS COM ESPAÇO COMO SUJEIRA"
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (2, '27/01/2015 ')
    GO
    
    --DATA VÁLIDA (formato "d/M/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (3, '27/1/2015')
    GO
    
    -- CONSULTA COM CONVERSÃO (COMO INDIQUEI)
    SELECT * FROM TB_PESSOA
    WHERE CONVERT(datetime, DT_NASCIMENTOTXT , 103) BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO
    
    --OUTRA CONSULTA (SEM CONVERSÃO)
    SELECT * FROM TB_PESSOA
    WHERE DT_NASCIMENTOTXT BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO

    Segue abaixo os print-screen's como "Evidência de Testes":

    COM CONVERSÃO NA CLÁUSULA "WHERE":

    "SEM" CONVERSÃO DE DADOS:

    Como você pode ver nesta demonstração, a conversão é "implícita" e como não há um padrão definido dos dados, ocorre o erro.

    Não quero denegrir a ajuda de ninguém, apenas esclarecer que poderá ocorrer "perda de informações" nas consultas do Leandro e dependendo da necessidade e criticidade do sistema, a perda de informações pode não ser tolerada.

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Cara amigo Durval e parceiro MVP,

    Perfeito a sua demonstração e explanação, o importante é conseguir ajudar e demonstrar possíveis cenários.

    Eu também não sou o dono da verdade, muito pelo contrário, no decorrer dos anos aqui nos fóruns, vou realmente fazendo o papel de moderador, procurando destacar alguns pontos de atenção e análise que devemos ter.

    Agora um detalhe importante, criar uma tabela com o campo data utilizando o tipo Varchar é algo que podemos considerar uma grande falta de análise ou conhecimento técnico, por outro lado eu sei que existem sistemas e até mesmo situações que temos que fazer uso do varchar, char ou qualquer outro tipo de dados caracter para armazenar uma data, é justamente neste ponto que temos que analisar e pensar como evitar.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 28 de janeiro de 2015 11:45
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Junior,

    Como informei para o Leandro, manter os dados com um datatype "texto"(varchar,char,...) poderá gerar diversos problemas, além de perda de dados.

    Certamente, a conversão de dados na clausula WHERE poderá gerar lentidão nas consultas desta tabela, mas vai garantir o retorno dos dados "com menor possibilidade" de perda de informações do que a alternativa proposta (e "marcada como resposta").

    Veja abaixo uma pequena demonstração:

    CREATE TABLE TB_PESSOA (
    CD_PESSOA			int			NOT NULL,
    DT_NASCIMENTOTXT	varchar(10)	NOT NULL
    ) 
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (1, '27/01/2015')
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy") "MAS COM ESPAÇO COMO SUJEIRA"
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (2, '27/01/2015 ')
    GO
    
    --DATA VÁLIDA (formato "d/M/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (3, '27/1/2015')
    GO
    
    -- CONSULTA COM CONVERSÃO (COMO INDIQUEI)
    SELECT * FROM TB_PESSOA
    WHERE CONVERT(datetime, DT_NASCIMENTOTXT , 103) BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO
    
    --OUTRA CONSULTA (SEM CONVERSÃO)
    SELECT * FROM TB_PESSOA
    WHERE DT_NASCIMENTOTXT BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO

    Segue abaixo os print-screen's como "Evidência de Testes":

    COM CONVERSÃO NA CLÁUSULA "WHERE":

    "SEM" CONVERSÃO DE DADOS:

    Como você pode ver nesta demonstração, a conversão é "implícita" e como não há um padrão definido dos dados, ocorre o erro.

    Não quero denegrir a ajuda de ninguém, apenas esclarecer que poderá ocorrer "perda de informações" nas consultas do Leandro e dependendo da necessidade e criticidade do sistema, a perda de informações pode não ser tolerada.

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Cara amigo Durval e parceiro MVP,

    Perfeito a sua demonstração e explanação, o importante é conseguir ajudar e demonstrar possíveis cenários.

    Eu também não sou o dono da verdade, muito pelo contrário, no decorrer dos anos aqui nos fóruns, vou realmente fazendo o papel de moderador, procurando destacar alguns pontos de atenção e análise que devemos ter.

    Agora um detalhe importante, criar uma tabela com o campo data utilizando o tipo Varchar é algo que podemos considerar uma grande falta de análise ou conhecimento técnico, por outro lado eu sei que existem sistemas e até mesmo situações que temos que fazer uso do varchar, char ou qualquer outro tipo de dados caracter para armazenar uma data, é justamente neste ponto que temos que analisar e pensar como evitar.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    Junior,

    Oh meu amigo! Desculpe, acho que houve um mal entendido.

    Eu queria responder sua questão(certamente você já conhece os efeitos senão não teria me questionado) e também indicar para o Leandro que poderia ocorrer perda de dados em alguns casos, mas acabei citando apenas seu nome.

    Faço questão de reafirmar aqui o que já disse à você pessoalmente: "Admiro seu trabalho nos fóruns e aprendo muito com você".

    Se "estou" hoje MVP, é porque compartilho meu conhecimento. Eu aprendi muito sobre isso (e SQL Server) com você. Obrigado!!!

    Leandro,

    Parte da mensagem (inclusive a demonstração) foi feita especialmente para alertar você sobre a possibilidade de "perda de dados" durante suas consultas, além é claro para esclarecer outras pessoas que possam consultar este tópico futuramente, veja como sua questão foi rapidamente indexada e disponibilizada para todos na Web (independentemente de ser vinculado à esta Comunidade):

    Googlehttps://www.google.com.br/search?q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&oq=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&aqs=chrome..69i57.1975j0j7&sourceid=chrome&es_sm=93&ie=UTF-8#q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&tbas=0

    Binghttp://www.bing.com/search?q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&go=Enviar&qs=n&form=QBLH&pq=&sc=0-0&sp=-1&sk=&cvid=bdac166215cb4fe187888aca40914c73

    Por esta razão eu me importo em fazer este "alerta".  ;^)

    Se possível converta esta coluna para um datatype "date", de acordo com sua necessidade.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 28 de janeiro de 2015 15:58
    Moderador
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Junior,

    Como informei para o Leandro, manter os dados com um datatype "texto"(varchar,char,...) poderá gerar diversos problemas, além de perda de dados.

    Certamente, a conversão de dados na clausula WHERE poderá gerar lentidão nas consultas desta tabela, mas vai garantir o retorno dos dados "com menor possibilidade" de perda de informações do que a alternativa proposta (e "marcada como resposta").

    Veja abaixo uma pequena demonstração:

    CREATE TABLE TB_PESSOA (
    CD_PESSOA			int			NOT NULL,
    DT_NASCIMENTOTXT	varchar(10)	NOT NULL
    ) 
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (1, '27/01/2015')
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy") "MAS COM ESPAÇO COMO SUJEIRA"
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (2, '27/01/2015 ')
    GO
    
    --DATA VÁLIDA (formato "d/M/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (3, '27/1/2015')
    GO
    
    -- CONSULTA COM CONVERSÃO (COMO INDIQUEI)
    SELECT * FROM TB_PESSOA
    WHERE CONVERT(datetime, DT_NASCIMENTOTXT , 103) BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO
    
    --OUTRA CONSULTA (SEM CONVERSÃO)
    SELECT * FROM TB_PESSOA
    WHERE DT_NASCIMENTOTXT BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO

    Segue abaixo os print-screen's como "Evidência de Testes":

    COM CONVERSÃO NA CLÁUSULA "WHERE":

    "SEM" CONVERSÃO DE DADOS:

    Como você pode ver nesta demonstração, a conversão é "implícita" e como não há um padrão definido dos dados, ocorre o erro.

    Não quero denegrir a ajuda de ninguém, apenas esclarecer que poderá ocorrer "perda de informações" nas consultas do Leandro e dependendo da necessidade e criticidade do sistema, a perda de informações pode não ser tolerada.

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Cara amigo Durval e parceiro MVP,

    Perfeito a sua demonstração e explanação, o importante é conseguir ajudar e demonstrar possíveis cenários.

    Eu também não sou o dono da verdade, muito pelo contrário, no decorrer dos anos aqui nos fóruns, vou realmente fazendo o papel de moderador, procurando destacar alguns pontos de atenção e análise que devemos ter.

    Agora um detalhe importante, criar uma tabela com o campo data utilizando o tipo Varchar é algo que podemos considerar uma grande falta de análise ou conhecimento técnico, por outro lado eu sei que existem sistemas e até mesmo situações que temos que fazer uso do varchar, char ou qualquer outro tipo de dados caracter para armazenar uma data, é justamente neste ponto que temos que analisar e pensar como evitar.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    Junior,

    Oh meu amigo! Desculpe, acho que houve um mal entendido.

    Eu queria responder sua questão(certamente você já conhece os efeitos senão não teria me questionado) e também indicar para o Leandro que poderia ocorrer perda de dados em alguns casos, mas acabei citando apenas seu nome.

    Faço questão de reafirmar aqui o que já disse à você pessoalmente: "Admiro seu trabalho nos fóruns e aprendo muito com você".

    Se "estou" hoje MVP, é porque compartilho meu conhecimento. Eu aprendi muito sobre isso (e SQL Server) com você. Obrigado!!!

    Leandro,

    Parte da mensagem (inclusive a demonstração) foi feita especialmente para alertar você sobre a possibilidade de "perda de dados" durante suas consultas, além é claro para esclarecer outras pessoas que possam consultar este tópico futuramente, veja como sua questão foi rapidamente indexada e disponibilizada para todos na Web (independentemente de ser vinculado à esta Comunidade):

    Googlehttps://www.google.com.br/search?q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&oq=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&aqs=chrome..69i57.1975j0j7&sourceid=chrome&es_sm=93&ie=UTF-8#q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&tbas=0

    Binghttp://www.bing.com/search?q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&go=Enviar&qs=n&form=QBLH&pq=&sc=0-0&sp=-1&sk=&cvid=bdac166215cb4fe187888aca40914c73

    Por esta razão eu me importo em fazer este "alerta".  ;^)

    Se possível converta esta coluna para um datatype "date", de acordo com sua necessidade.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 28 de janeiro de 2015 15:59
    Moderador
  • Leandro,

    Procure estudar uma possibilidade de alterar este datattype para "date" ou "datetime" (de acordo com sua necessidade) para minimizar problemas de informações não localizadas e lentidão no sistema.

    Como alternativa, faça um teste adaptando o script T-SQL abaixo à sua necessidade:

    SELECT * FROM tabela
    WHERE CONVERT(datetime, data , 103) 
    BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    https://msdn.microsoft.com/pt-br/library/ms186819.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Só um detalhe, sempre que utilizarmos a função Convert na cláusula Where temos que ter em mente que estaremos forçando o SQL Server a mudar totalmente a sua forma de execução, o que poderá impactar no processamento.

    Será que realmente é necessário fazer o Convert apontando para a Coluna Data?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Junior,

    Como informei para o Leandro, manter os dados com um datatype "texto"(varchar,char,...) poderá gerar diversos problemas, além de perda de dados.

    Certamente, a conversão de dados na clausula WHERE poderá gerar lentidão nas consultas desta tabela, mas vai garantir o retorno dos dados "com menor possibilidade" de perda de informações do que a alternativa proposta (e "marcada como resposta").

    Veja abaixo uma pequena demonstração:

    CREATE TABLE TB_PESSOA (
    CD_PESSOA			int			NOT NULL,
    DT_NASCIMENTOTXT	varchar(10)	NOT NULL
    ) 
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (1, '27/01/2015')
    GO
    
    --DATA VÁLIDA (formato "dd/MM/yyyy") "MAS COM ESPAÇO COMO SUJEIRA"
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (2, '27/01/2015 ')
    GO
    
    --DATA VÁLIDA (formato "d/M/yyyy")
    INSERT INTO TB_PESSOA (CD_PESSOA, DT_NASCIMENTOTXT)
    VALUES (3, '27/1/2015')
    GO
    
    -- CONSULTA COM CONVERSÃO (COMO INDIQUEI)
    SELECT * FROM TB_PESSOA
    WHERE CONVERT(datetime, DT_NASCIMENTOTXT , 103) BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO
    
    --OUTRA CONSULTA (SEM CONVERSÃO)
    SELECT * FROM TB_PESSOA
    WHERE DT_NASCIMENTOTXT BETWEEN DATEADD(dd, -30, GETDATE()) AND GETDATE()
    GO

    Segue abaixo os print-screen's como "Evidência de Testes":

    COM CONVERSÃO NA CLÁUSULA "WHERE":

    "SEM" CONVERSÃO DE DADOS:

    Como você pode ver nesta demonstração, a conversão é "implícita" e como não há um padrão definido dos dados, ocorre o erro.

    Não quero denegrir a ajuda de ninguém, apenas esclarecer que poderá ocorrer "perda de informações" nas consultas do Leandro e dependendo da necessidade e criticidade do sistema, a perda de informações pode não ser tolerada.

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Cara amigo Durval e parceiro MVP,

    Perfeito a sua demonstração e explanação, o importante é conseguir ajudar e demonstrar possíveis cenários.

    Eu também não sou o dono da verdade, muito pelo contrário, no decorrer dos anos aqui nos fóruns, vou realmente fazendo o papel de moderador, procurando destacar alguns pontos de atenção e análise que devemos ter.

    Agora um detalhe importante, criar uma tabela com o campo data utilizando o tipo Varchar é algo que podemos considerar uma grande falta de análise ou conhecimento técnico, por outro lado eu sei que existem sistemas e até mesmo situações que temos que fazer uso do varchar, char ou qualquer outro tipo de dados caracter para armazenar uma data, é justamente neste ponto que temos que analisar e pensar como evitar.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    Junior,

    Oh meu amigo! Desculpe, acho que houve um mal entendido.

    Eu queria responder sua questão(certamente você já conhece os efeitos senão não teria me questionado) e também indicar para o Leandro que poderia ocorrer perda de dados em alguns casos, mas acabei citando apenas seu nome.

    Faço questão de reafirmar aqui o que já disse à você pessoalmente: "Admiro seu trabalho nos fóruns e aprendo muito com você".

    Se "estou" hoje MVP, é porque compartilho meu conhecimento. Eu aprendi muito sobre isso (e SQL Server) com você. Obrigado!!!

    Leandro,

    Parte da mensagem (inclusive a demonstração) foi feita especialmente para alertar você sobre a possibilidade de "perda de dados" durante suas consultas, além é claro para esclarecer outras pessoas que possam consultar este tópico futuramente, veja como sua questão foi rapidamente indexada e disponibilizada para todos na Web (independentemente de ser vinculado à esta Comunidade):

    Googlehttps://www.google.com.br/search?q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&oq=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&aqs=chrome..69i57.1975j0j7&sourceid=chrome&es_sm=93&ie=UTF-8#q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&tbas=0

    Binghttp://www.bing.com/search?q=%22CONVERTER+VARCHAR+PARA+FORMATO+DATA%22&go=Enviar&qs=n&form=QBLH&pq=&sc=0-0&sp=-1&sk=&cvid=bdac166215cb4fe187888aca40914c73

    Por esta razão eu me importo em fazer este "alerta".  ;^)

    Se possível converta esta coluna para um datatype "date", de acordo com sua necessidade.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Meu amigo sem problemas, tranquilo eu entendi sim perfeitamente, fique em paz, agradeço a sua admiração, eu também aprendi muito e venha aprendendo com você, também sou seu admirador.

    Um grande abraço, é como eu sempre falo, vivendo e apredendo a compartilhar o conhecimento.

    Até mais.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 28 de janeiro de 2015 17:32