none
Data de Criação < getdate() RRS feed

  • Pergunta

  • Oi Pessoal, 

    Estou com a query abaixo, para pegar todos os pedidos dos clientes menor que a data atual, ou seja, preciso trazer todos os pedidos que não seja do dia.

    Acontece que quando está virando o mês a query não está trazendo os pedidos do mês passado, somente o resultado do mês atual. Ex: Rodeia query hoje no dia 03/06, ela trouxe somente os pedidos do dia 01/06 e 02/06, porém existem pedidos do dia 28/05 e 29/05.

    Como posso resolver esse caso ?

    select
    nro_pedido_nota_fiscal as 'PEDIDO'
    ,nom_arq_nota_fiscal as 'NOME DO ARQUIVO'
    ,nom_distribuidor as 'DISTRIBUIDOR'
    ,cnpj_cliente as 'CNPJ_CLIENTE'
    ,c.raz_social_cliente as 'CLIENTE',
    CONVERT(nvarchar(10), rn.dat_criacao, 103)as 'DATA PEDIDO FATURADO',
    d.NOM_GRUPO_DISTRIBUIDOR as 'GRUPO DISTRIBUIDOR'

    from   Robo_notafiscal..nota_fiscal as rn
    inner join farmaprod..distribuidor as d
           on rn.cod_distribuidor=d.cod_distribuidor
    inner join cliente as c   
           on c.Cod_cliente=rn.cnpj_cliente 
    where 
    status_arq_download ='0' 
    and     rn.dat_criacao < CONVERT(nvarchar(10),GETDATE(),103) ---Aqui #

    quarta-feira, 3 de junho de 2015 14:23

Respostas

  • Jose, 

    Com essa sugestão que você passou funcionou bem, se tratava realmente da comparação entre as strings;

    Obrigado pela ajuda.

    • Marcado como Resposta Jhonh Vieira quarta-feira, 3 de junho de 2015 17:53
    quarta-feira, 3 de junho de 2015 17:53

Todas as Respostas

  • Duas coisas:

    1- voce nao precisa fazer um convert de data no where

    2- O que pode estar causando a eliminaçao dos registros do mes de maio talvez seja seu segundo criterio.

    Faça assim:

    select
    nro_pedido_nota_fiscal as 'PEDIDO'
    ,nom_arq_nota_fiscal as 'NOME DO ARQUIVO'
    ,nom_distribuidor as 'DISTRIBUIDOR'
    ,cnpj_cliente as 'CNPJ_CLIENTE'
    ,c.raz_social_cliente as 'CLIENTE',
    CONVERT(nvarchar(10), rn.dat_criacao, 103)as 'DATA PEDIDO FATURADO',
    d.NOM_GRUPO_DISTRIBUIDOR as 'GRUPO DISTRIBUIDOR'
    , status_arq_download 
    from   Robo_notafiscal..nota_fiscal as rn
    inner join farmaprod..distribuidor as d
           on rn.cod_distribuidor=d.cod_distribuidor
    inner join cliente as c   
           on c.Cod_cliente=rn.cnpj_cliente 
    where rn.dat_criacao < GETDATE()

    rode a query acima e nos diga o que trouxe.


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 3 de junho de 2015 14:30
  • Olá,

          A sua query aparentemente está correta se analisarmos apenas o comando que filtra a data.. Você já verificou se o filtro do campo Status_Arq_Download está como 0 para os casos do mês anterior?

          Experimente esse comando e veja qual é a data que o SQL está usando para o filtro de data:

    select CONVERT(nvarchar(10),GETDATE(),103)

         Uma outra sugestão é você utilizar um filtro que não esteja sujeito às variações de linguagem e globalização.. Tente fazer o filtro assim:

    and     rn.dat_criacao < Cast(getdate() as Date)

         Verifique também o tipo de dado da coluna Dat_Criacao apenas para ter certeza que é um tipo de dado de Data e/ou Data e hora e não um Varchar, por exemplo...


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 3 de junho de 2015 14:30
    Moderador
  • Deleted
    quarta-feira, 3 de junho de 2015 15:04
  • Jose, 

    Com essa sugestão que você passou funcionou bem, se tratava realmente da comparação entre as strings;

    Obrigado pela ajuda.

    • Marcado como Resposta Jhonh Vieira quarta-feira, 3 de junho de 2015 17:53
    quarta-feira, 3 de junho de 2015 17:53
  • William, 

    Não funcionou dessa forma, mas obrigado pela ajuda.

    quarta-feira, 3 de junho de 2015 17:54
  • Roberto, 

    Não funcionou dessa forma, mas obrigado pela ajuda.

    quarta-feira, 3 de junho de 2015 17:55
  • Jose, 

    Com essa sugestão que você passou funcionou bem, se tratava realmente da comparação entre as strings;

    Obrigado pela ajuda.

    Jhonh,

          Recomendo fortemente que você avalie a última frase do Jose.Diz "Obviamente que a restrição acima é non-sargeable." Ou seja, essa solução apesar de resolver momentaneamente seu problema, não é a melhor solução e pode trazer problemas de performance na sua aplicação.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 3 de junho de 2015 18:00
    Moderador
  • Recomendo que você reavalie a estrutura da sua base de dados, porque há problemas em sua estrutura!


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 3 de junho de 2015 18:02
    Moderador
  • and     rn.dat_criacao < CONVERT(nvarchar(10),GETDATE(),103) ---Aqui #

    Jhonh, como está declarada a coluna rn.dat_criacao? Date? datetime? varchar?

    Se a coluna está declarada como varchar e a data está armazenada no formato dd/mm/aaaa, então terá que realizar uma transformação no conteúdo da coluna antes de efetuar a comparação. Isto porque '31/05/2015' é maior do que '01/06/2015', quando comparando string.

    Sugestão:

    -- código 1
    SELECT
    ... where ... and Convert(date, rn.dat_criacao, 103) < Cast(Current_Timestamp as date);

    Obviamente que a restrição acima é non-sargeable.

     


        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)



    José,

         Agradeço pelo seu empenho em tentar sempre ajudar e sem desmerecer a sua resposta, que pode ser utilizada, sem problemas. Mas por favor, sem ressentimentos, eu gostaria de dar minha opinião.

         Sugiro que seja evitado sempre que possível esse tipo de sugestão porque pode induzir outros que tenham a mesma dúvida em utilizar uma construção inadequada em suas bases de dados quando o problema é na estrutura da base. Lembre-se que a thread ficará disponível para outros que tiverem a mesma dúvida e que poderão ter problemas de performance pela utilização de uma estrutura non-SARGeable. http://sqlblog.com/blogs/ben_miller/archive/2008/08/29/what-is-a-sarg-exactly-training-classes-and-knowledge-retention.aspx


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 3 de junho de 2015 18:11
    Moderador
  • Roberto, 

    Qual seria melhor alternativa para que seja uma query eficiente? 

    A coluna rn.data_criação está como nvarchar(30),null.


    quarta-feira, 3 de junho de 2015 19:12
  • O correto é usar o tipo datetime para essa coluna. A formataçao da data deve ser feita somente na interface.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 3 de junho de 2015 19:28
  • O problema que está base foi criada dessa forma e está em uso, acredito que há anos, mas de qualquer forma estou usando essa query apenas no Excel vinculada com sql server.

    quarta-feira, 3 de junho de 2015 19:35
  • O que está acontecendo na sua base é o seguinte. Você não tem controle sobre o dado que está sendo armazenado neste campo. Por exemplo:

    Se você fizer um select e retornar:

    01/01/12

    02/01/11

    03/01/03

    04/05/11

    06/04/10

    01.05.15

    12.05.12

    Qual é o formato de datas que está armazenado? dia, mes, ano ou ano, mes, dia ou mes, dia, ano? Os valores são válidos (são uma data)?

    A única resposta que eu posso dar apenas visualizando os dados é que são dados válidos (são datas)! Pior seria se retornasse "abd', 'teste', 'xxx' (que é válido para um VARCHAR)... O problema é que esses dados são armazenados pela aplicação dependendo da linguagem do windows que está gravando, pode ser em qualquer formato... você não tem controle sobre isso... (apenas a aplicação pode contornar isso)...

    Mas eu não consigo de forma nenhuma dizer qual é o formato delas... Aí é que está o erro! Este campo não é adequado para datas! Você está causando sobrecarga no SQL e na aplicação que tem que ficar convertendo esse texto em data sempre que ele precisa... Isso causa lentidão porque o SQL precisa acionar o processador para fazer todos os cálculos necessários (quando usar o CAST ou CONVERT). Além disso, sempre que você utiliza um argumento non-SARGeable, o SQL pode desprezar o índice e fazer um Table Scan, o pior problema neste caso é que você pode ter 1000 ou 100 milhões de linhas... e fazer um table Scan (ou um index scan) em 100 milhões de linhas VAI DEMORAR! Pode ter certeza disso!

    Por este motivo, a melhor solução no seu caso seria modificar o campo para DATETIME (Ou DATE), NULL que você evitaria todos esses problemas e poderia utilizar o filtro conforme o exemplo:

    and     rn.dat_criacao < Cast(getdate() as Date)

    Parece simple, não??!?!? Não é simples! Você terá que avaliar MUITO bem se a sua aplicação não vai ter nenhum efeito colateral indesejado.

    Faça um teste na sua tabela e me diga se retornou resultados:

    select * from Robo_Notafiscal..nota_Fiscal
    where isdate(dat_Criacao) = 0
    Se retornar, e você estiver usando a construção abaixo
    and Convert(date, rn.dat_criacao, 103) < Cast(Current_Timestamp as date); 
    ela vai falhar e você terá um erro na aplicação.



    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    quarta-feira, 3 de junho de 2015 20:00
    Moderador
  • Deleted
    quarta-feira, 3 de junho de 2015 20:06