Usuário com melhor resposta
Ajuda Data

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,'SelectUF,
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'
)
Respostas
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
-
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
-
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.
-
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 SnippetSelect
* From OPENQUERY(
ESCDBPRD01,'SelectUF,
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 '
); -
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
-
Sobre o Group By Blz,
O local onde está dando erro por eleminanção conforme vc orientou foi esse.
Code SnippetCase 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,
-
-
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.
-
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