Usuário com melhor resposta
Data de Criação < getdate()

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 #
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
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
----------------------------------------------------------
-
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
- Sugerido como Resposta Claudinei Nascimento quarta-feira, 3 de junho de 2015 14:37
-
-
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
-
-
-
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
-
-
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
-
-
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
----------------------------------------------------------
-
-
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 abaixoand 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
- Editado Roberto F FonsecaModerator quarta-feira, 3 de junho de 2015 20:14
-