none
Ajuda Data RRS feed

  • Pergunta

  • Amigos tenho um Openquery(SQLSERVER) que executada a seguinte consulta e retorna 742.632

    Select * From OPENQUERY

    (ESCDBPRD01,'Select *

    From ESCADINHA_200810_FIXA_SE

    Where Dt_Novo_Vencto >= 20080701');

     

    Porém quando executo o mesmo script com os campos trabalhados me retorna 48.860.

    PODERIAM ME AJUDAR? É ALGUMA COISA NO FORMATO DAS DATAS?

     

    Select * From OPENQUERY

    (ESCDBPRD01,'Select

    UF,

    Cast(Ano_Mes_Fat as BigInt) as Ano_Mes_Fat,

    Cast(Nr_CNPJ_CPF_Cliente as BigInt) as Nr_CNPJ_CPF_Cliente,

    Cast(Cd_Localidade as BigInt) as Cd_Localidade,

    Cast(Nr_Meio_Acesso as BigInt) as Nr_Meio_Acesso,

    Cast(Nr_Conjunta as BigInt) as Nr_Conjunta, Cast (Nr_Sequencia as BigInt) as Nr_Sequencia,

    Cast (Nr_Ciclo as BigInt) as Nr_Ciclo,

    Convert(smalldatetime, Dt_Novo_Vencto, 103) as Dt_Novo_Vencto,

    Case When isDate(Cast(Substring(Dt_Recebimento, 1, 4) + ''/'' +

    Substring(Dt_Recebimento, 5, 2) + ''/'' +

    Substring(Dt_Recebimento, 7, 2) as Varchar(10))) = 0

    Then null Else Convert(SmallDateTime, Dt_Recebimento, 103) End as Dt_Recebimento,

    Case When isDate(Cast(Substring(Dt_Cancelamento, 1, 4) + ''/'' +

    Substring(Dt_Cancelamento, 5, 2) + ''/'' +

    Substring(Dt_Cancelamento, 7, 2) as Varchar(10))) = 0

    Then null Else Convert(SmallDateTime, Dt_Cancelamento, 103) End as Dt_Cancelamento,

    Cast(Cd_Cancelamento as BigInt) as Cd_Cancelamento,

    Cast(Vl_Telemar as Money)/100 as Vl_Telemar,

    Cast(Vl_Terceiros as Money)/100 as Vl_Terceiros,

    Cast(Vl_Credito as Money)/100 as Vl_Credito,

    Cast(Tp_Assinante as BigInt) as Tp_Assinante,

    Case When isDate(Cast(Substring(Dt_Instalacao, 1, 4) + ''/'' +

    Substring(Dt_Instalacao, 5, 2) + ''/'' +

    Substring(Dt_Instalacao, 7, 2) as Varchar(10))) = 0

    Then null Else Convert(SmallDateTime, Dt_Instalacao, 103) End as Dt_Instalacao,

    Cast(Tp_Linha as BigInt) as Tp_Linha,

    Cast(Cd_Servico as BigInt) as Cd_Servico, Unidade_Negocio,

    Cast(Id_Fis_Jur as BigInt) as Id_Fis_Jur,

    Cast(Dac as BigInt) as Dac,

    Cast(Cd_Relac_Cliente as BigInt) as Cd_Relac_Cliente,

    Tipo_Pessoa

    From ESCADINHA_200810_FIXA_SE

    Where Dt_Novo_Vencto >= 20080701

    Group by UF, Ano_Mes_Fat, Nr_CNPJ_CPF_Cliente, Cd_Localidade, Nr_Meio_Acesso,

    Nr_Conjunta, Nr_Sequencia, Nr_Ciclo,Dt_Novo_Vencto, Dt_Recebimento, Dt_Cancelamento, Cd_Cancelamento, Vl_Telemar, Vl_Terceiros,

    Vl_Credito, Tp_Assinante, Dt_Instalacao, Tp_Linha, Cd_Servico, Unidade_Negocio, Id_Fis_Jur, Dac, Cd_Relac_Cliente, Tipo_Pessoa')

    quarta-feira, 26 de novembro de 2008 17:49

Respostas

  • Boa Tarde Daniel,

     

    A função ISDATE irá avaliar se é uma data válida, mas talvez nem todas as datas válidas possam ser expressas como SMALLDATETIME. Tente trocar para DATETIME apenas para testes.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 26 de novembro de 2008 20:01

Todas as Respostas

  • Boa Tarde Daniel,

     

    Uma vez que a cláusula GROUP BY esteja presente há uma chance enorme de redução na quantidade de registros. Afinal a cláusula agrupa registros e se estes são em grupos a chance de haver menos registros é enorme.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 26 de novembro de 2008 17:54
  • Olá Dralves,

     

    A primeira query, não tem GROUP BY nenhum. A segunda, tem um monte de campos agrupados. Com certeza os valores retornados seriam diferentes, certo?

     

    O "problema" não parece ser nas datas, mas sim no agrupamento (GROUP BY) utilizado na query maior. Utilizando GROUP BY, a quantidade de registros retornados com certeza será menor.

     

    Um abraço,

    Raul Santos Neto

     

    quarta-feira, 26 de novembro de 2008 17:55
  • Alves,

     

    Mas tomando por base este volume de informações, qual seria o volume aceitável.

     

    Se você esta utilizando um conjunto de campos para serem agrupados, consequentemente o SQL Server vai tentar unir todos os dados, respeitando os critérios colocados no query.

     

     

    quarta-feira, 26 de novembro de 2008 18:35
  • Galera blz

     

    se tirar o Group By vai reduzir, porém agora está dando o seguinte erro.

     

    Msg 296, Level 16, State 3, Line 1

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

     

    Porém o meu OpenQuery é:

     

    PODERIAM AJUDAR?

     

    Code Snippet

    Select * From OPENQUERY

    (ESCDBPRD01,'Select

    UF,

    Cast(Ano_Mes_Fat as BigInt) as Ano_Mes_Fat,

    Cast(Nr_CNPJ_CPF_Cliente as BigInt) as Nr_CNPJ_CPF_Cliente,

    Cast(Cd_Localidade as BigInt) as Cd_Localidade,

    Cast(Nr_Meio_Acesso as BigInt) as Nr_Meio_Acesso,

    Cast(Nr_Conjunta as BigInt) as Nr_Conjunta, Cast (Nr_Sequencia as BigInt) as Nr_Sequencia,

    Cast (Nr_Ciclo as BigInt) as Nr_Ciclo,

     

    Case When isDate(Cast(Substring(Dt_Novo_Vencto, 1, 4) + ''/'' +

    Substring(Dt_Novo_Vencto, 5, 2) + ''/'' +

    Substring(Dt_Novo_Vencto, 7, 2) as Varchar(10))) = 0

    Then null Else Convert(SmallDateTime, Dt_Novo_Vencto, 103) End as Dt_Novo_Vencto,

     

    From ESCADINHA_200810_FIXA_SE

    Where Dt_Novo_Vencto >= 20080701 ');

     

     

    quarta-feira, 26 de novembro de 2008 19:33
  • Boa Tarde Daniel,

     

    Acredito que os problemas não são relacionados. O Group By não tem relação com o erro em anexo.

    Ainda existe alguma pendência sobre o GROUP BY ? Tem alguma coisa que não ficou clara ?

     

    Sobre o erro, retire primeiro todos os CASTs e CASEs da consulta e vá colocando um por vez para identificarmos qual dos CASTs ou CASEs está provocando o erro.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 26 de novembro de 2008 19:47
  • Sobre o Group By Blz,

     

    O local onde está dando erro por eleminanção conforme vc orientou foi esse.

     

    Code Snippet

    Case When isDate(Cast(Substring(Dt_Novo_Vencto, 1, 4) + ''/'' +

    Substring(Dt_Novo_Vencto, 5, 2) + ''/'' +

    Substring(Dt_Novo_Vencto, 7, 2) as Varchar(10))) = 0

    Then null Else Convert(SmallDateTime, Dt_Novo_Vencto, 103) End as Dt_Novo_Vencto,

     

     

    quarta-feira, 26 de novembro de 2008 19:55
  • Boa Tarde Daniel,

     

    A função ISDATE irá avaliar se é uma data válida, mas talvez nem todas as datas válidas possam ser expressas como SMALLDATETIME. Tente trocar para DATETIME apenas para testes.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 26 de novembro de 2008 20:01
  • Gustavo,

     

    funcionou utilizando o DateTime, porém na minha table está configurado como Smalldatetime.

     

    Eu utilizo esse openquery para incluir nesta table. Portanto irá funcionar se eu converte para DateTime e tentar inserir para Smalldatetime?

     

    Desde já agradeço.

    quarta-feira, 26 de novembro de 2008 20:11
  • Olá Daniel,

     

    Se funcionou com DATETIME é porque existe alguma data que está "estourando" o RANGE para SMALLDATETIME. Pode ser que exista alguma data cadastrada errada e cujo o registro está anterior a 1900 ou superior a 2079. Faça um SELECT nessa coluna e investigue para verificar que data está provocando esse estouro. Arrume-a e então sim a consulta irá funcionar.

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 26 de novembro de 2008 21:04