PERGUNTAS E RESPOSTAS
 
Bem Vindo, Visitante  Todos os Fórums
  Base de Dados
Enviar para a impressoraImprimir  Enviar e-mail para um amigoEnviar Para um Amigo
Precisa estar Logado

Subject Assunto:
SQL dia útil anterior
Versão:
.
Plataforma:
Microsoft
Complemento:
DB:
SQL Server
Complemento:
Select.JPG (anexo)
LinkedIn
Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 30/10/2017, 15:30 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Boa tarde!

preciso de um comando que retorne o total de coletas realizadas no dia anterior, porém, quando é segunda feira o comando precisa retornar o total de sexta. Alguém pode me ajudar?

Select
COUNT(A.NrColeta) as Coleta
From CCEColet A
Where A.DtEmissao < DATEADD(day, 0, convert(date, GETDATE())) and A.DtEmissao > DATEADD(day, 0, convert(date, GETDATE()-3))
and (A.InSituacao = 0 or A.InSituacao is Null)

Mensagem do Enviar e-mail Abrir o Perfil do usuário ROBERTOMEN ROBERTOMEN em 30/10/2017, 16:26 h
Local: PR  Registro: 04/07/2017  Postagens: 442

dData := date()     // data atual

dData := date() -1 // dia anterior

if dow(dData) = 2 // Se for Segunda Feira,,volta pra sexta
   dData = dData -3   
endif


Select
COUNT(A.NrColeta) as Coleta
From CCEColet A
Where A.DtEmissao = DATEADD(day, 0, convert(date, dData ))
and (A.InSituacao = 0 or A.InSituacao is Null)


Seria isto?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 30/10/2017, 17:14 h
Local: SP  Registro: 20/08/2010  Postagens: 670
Se você quer resolver tudo na instrução SQL e estiver usando o SQL Server, tente:

Select A.DtEmissao, COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and A.DtEmissao = (GETDATE() - CASE DATEPART(WEEKDAY, GETDATE() - 1)
                              WHEN 1 THEN 3
                              WHEN 7 THEN 2
                              ELSE 1 END)

Group by A.DtEmissao

Retorna as coletas do dia anterior, a partir da data do banco de dados. Se segunda, domingo ou sábado, pega o total da sexta-feira anterior.
A instrução acima assume que o primeiro dia da semana no banco de dados seja domingo.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 31/10/2017, 10:32 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Roberto, Emerson, bom dia!

Obrigado pela resposta. Porém, não funcionou o código de vocês. Quero rodar isso direto no sql server. Como não sou especialista em SQL, talvez falte ajustar algum parâmetro no comando de vocês, podem me ajudar?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 31/10/2017, 14:22 h
Local: SP  Registro: 20/08/2010  Postagens: 670
A instrução que eu te passei deveria rodar diretamente no SQL Server.

O que você quer dizer com "não funcionou"? Deu erro? Não trouxe os dados como você esperava?

tente o seguinte:

DECLARE @data datetime

SET @data = ‘2017-10-23‘

Select
     @data DIA_AVALIADO,
     (@data - 1) DIA_ANTERIOR,
     @data - CASE DATEPART(WEEKDAY, @data - 1)
                    WHEN 1 THEN 3
                    WHEN 7 THEN 2
                    ELSE 1 END DIA_CONSIDERADO


basta trocar o conteúdo de @data e executar a instrução. fiz o teste e funcionou perfeitamente.


Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 31/10/2017, 16:26 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Emerson, boa tarde!

Desculpe pelo incomodo. O seu código esta correto, contudo a porcaria do meu sistema grava as informações date+hora. Então, acho que preciso retornar tudo que foi emitido no período das 00:01 até 23:59 do dia útil anterior. É possível?

Teu código esta correto, mas preciso acrescentar a faixa de hora

Select A.DtEmissao, COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and A.DtEmissao = (GETDATE() - CASE DATEPART(WEEKDAY, GETDATE() - 1)
                             WHEN 1 THEN 3
                             WHEN 7 THEN 2
                             ELSE 1 END)

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 31/10/2017, 16:28 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Ou melhor, tem algum forma de considerar apenas a data do campo e desconsiderar a hora?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 31/10/2017, 16:31 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Segue o print da consulta.

Select A.DtEmissao, COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and A.DtEmissao = (GETDATE() - CASE DATEPART(WEEKDAY, GETDATE() - 1)
                             WHEN 1 THEN 3
                             WHEN 7 THEN 2
                             ELSE 1 END)

Então a consulta esta correta, porém não retorna informações pq meu sistema grava a hora, para saber tudo que foi emitido no dia útil anterior, preciso também especificar a faixa de hora entre 00:00:01 e 23:59:00.

Consegue me ajudar?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 31/10/2017, 17:03 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Quando eu informo na condição A.DtEmissao >= retorna o total de coletas de ontem e hoje. Porém eu preciso apenas das coletas de ontem.

Tentei fazer duas condições uma com A.DtEmissao > e outra com A.Dtemissao < porém não retorna nenhum valor.


DECLARE @data datetime

SET @data = cast(getdate() as date)

Select COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and A.DtEmissao >= @data - CASE DATEPART(WEEKDAY, @data -1)
                    WHEN 1 THEN 3
                    WHEN 7 THEN 2
                    ELSE 1 END

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 31/10/2017, 17:05 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Comando abaixo retorna 1021 coletas:
30/10 - 538
31/10 - 483
total - 1021



DECLARE @data datetime

SET @data = cast(getdate() as date)

Select COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and A.DtEmissao >= @data - CASE DATEPART(WEEKDAY, @data -1)
                    WHEN 1 THEN 3
                    WHEN 7 THEN 2
                    ELSE 1 END

Mensagem do Enviar e-mail Abrir o Perfil do usuário ROBERTOMEN ROBERTOMEN em 01/11/2017, 08:30 h
Local: PR  Registro: 04/07/2017  Postagens: 442


DECLARE @data datetime

SET @data = cast(getdate() as date)

Select COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and A.DtEmissao >= @data - CASE DATEPART(WEEKDAY, @data -1)
                    WHEN 1 THEN 2
                    WHEN 7 THEN 1
                    END


tente assim,,,eu entendi o seguinte:

se vc imprimir na terça,,sai as coletas de segunda feira,,se imprimir na quarta,,sai as de terça,,se imprimir na quinta,,sai as de quarta....se imprimir na segunda feira,no sábado ou no domindo ,,sai as de sexta feita.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 01/11/2017, 09:01 h
Local: SP  Registro: 20/08/2010  Postagens: 670
Roberto, nesse seu ultimo post, dependendo do horário que ele executar a consulta, o resultado mostrará a consulta do dia anterior e também do dia corrente.

O ideal é avaliar somente a parte "data" do campo.

Select A.DtEmissao, COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and cast(A.DtEmissao as date) = (GETDATE() - CASE DATEPART(WEEKDAY, GETDATE()- 1)
                             WHEN 1 THEN 3
                             WHEN 7 THEN 2
                             ELSE 1 END)

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 01/11/2017, 09:04 h
Local: SP  Registro: 20/08/2010  Postagens: 670
ops... faltou o Group By A.DtEmissao ou a retirada do campo A.DTEmissao do resultado.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 01/11/2017, 12:49 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Emerson, boa tarde!

Não gera, pois o meu sistema grava os registros do campo DtEmissao que é do tipo datetime. por isso tem que ser > que ontem e < que hoje. Mas eu não consigo fazer essa lógica no sql.
Se o campo DtEmissao fosse do tipo data o comando estaria funcionando certo.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 01/11/2017, 14:23 h
Local: SP  Registro: 20/08/2010  Postagens: 670
você testou com a última instrução que eu passei?
porque nela é tratada somente a parte "data" do campo.

Select COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and cast(A.DtEmissao as date) = (GETDATE() - CASE DATEPART(WEEKDAY, GETDATE()- 1)
                             WHEN 1 THEN 3
                             WHEN 7 THEN 2
                             ELSE 1 END)

note que no where, onde há referencia ao campo A.DtEmissao, agora é utilizada a função CAST() que transforma o conteúdo em data.


faça um teste:

Select A.DtEmissao, cast(A.DtEmissao as date) so_data
From CCEColet A

as duas colunas retornam o mesmo valor?




Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 01/11/2017, 17:59 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Emerson,

o primeiro sql retornou 0

o segundo sql retornou null


Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 04/11/2017, 15:01 h
Local: SP  Registro: 20/08/2010  Postagens: 670
É minha última tentativa, visto que a forma passada já deveria ter funcionado:

Select COUNT(A.NrColeta) as Coleta
From CCEColet A
Where coalesce(A.InSituacao,0) = 0
and convert(varchar(10), A.DtEmissao, 103) = convert(varchar(10), (GETDATE() - CASE DATEPART(WEEKDAY, GETDATE()- 1)
                             WHEN 1 THEN 3
                             WHEN 7 THEN 2
                             ELSE 1 END), 103)


apenas verifique se a sintaxe da função convert() está correta, porque onde estou agora não tem SQL Server instalado.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário TRANSVILLE TRANSVILLE em 06/11/2017, 08:32 h
Local: SC  Registro: 30/10/2017  Postagens: 12
Edmilson Wessling

Emerson, bom dia!

Funcionou, retornou as coletas de sexta. Muito obrigado.

Para postar no Fórum você precisa efetuar o seu login ou se registrar

 Mudar para Fórum

 

 

 
 
   
Pagina Principal Shopping PROTHEUS Tire suas duvidas Vagas Microsiga em todo Brasil Aprofunde seus conhecimentos Noticias Online Fale Conosco Pagina Principal