none
Comando Ajuda RRS feed

  • Pergunta

  • Pessoal boa tarde,

    Preciso de ajuda para o comando abaixo:

    WHERE

    (dbo.tblWRIAndamentos.Observacao LIKE '%Data prevista%:' + CONVERT(char(10), GETDATE() - 1, 103) + '%') AND (dbo.tblWRIRecepcao.DtCancelamento IS NULL) ORDER  BY  Recepcao

    eu to fazendo GETDATE() - 1

    Porem eu precisava deste mesmo comando apenas com dias uteis ou seja na segunda feira, esse comando me retorna dados do domingo ou seja sem registro nenhum, eu precisava que retornava de sexta-feira, e assim por diante.

    Como faço isso ?

    segunda-feira, 10 de setembro de 2012 16:44

Respostas

  • Sim, amigo. Por isso que eu disse que você deve trocar o campo "Data" que eu usei pela função GetDate, mencionada por você na abertura da Thread:

    Case
      When DatePart(weekday, GetDate() - 1) = 2 Then
        GetDate() - 2
      Else
        GetDate() - 1
    End

    Se o dia anterior for domingo, retorna sábado. Senão, retorna o próprio dia anterior.

    Se quiser que retorne só de segunda à sexta, você vai mexendo nesse código, montando o que precisa.

    Outro exemplo:

    Case
      When DatePart(weekday, GetDate() - 1) = 1 Then
        GetDate() - 2
      When DatePart(weekday, GetDate() - 1) = 2 Then
        GetDate() - 3
      Else
        GetDate() - 1
    End

    O código acima retorna:

    • Sexta-feira quando o dia atual é domingo;
    • Sexta-feira quando o dia atual é segunda;
    • Para qualquer outro dia, retorna o dia anterior.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    segunda-feira, 10 de setembro de 2012 18:51
    Moderador

Todas as Respostas

  • Isso não vai ser tão fácil.

    Neste exemplo deveria retornar sábado, em vez de domingo. Mas quem disse que sábado foi dia útil? E se foi um feriado nacional, por exemplo? E se a empresa não funcionou por algum outro motivo?

    E se domingo funcionou porque o diretor decidiu abrir a loja devido a um grande evento na cidade?

    Ou seja, "dia útil" é um conceito que pode sofrer variações. Por isso normalmente existem "tabelas" onde se cadastra dias não-úteis fixos (Natal, por exemplo) e dias não-úteis variáveis (que varia de empresa para empresa).

    Aí, em seguida, cria-se uma inteligência para desconsiderar as datas cadastradas nestas tabelas e, se for o caso, desconsiderar adicionalmente os domingos.

    A regra precisa ser muito bem pensada.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de setembro de 2012 16:51
    Moderador
  • Em tempo: essa questão é recorrente aqui no fórum.

    Faça uma pesquisa com algumas palavras-chave como "Cálculo horas" ou "Dias úteis" e encontrará diversas Threads com estas questões.

    Isso lhe ajudará a ampliar sua visão sobre o negócio e a definir o ponto de desenvolvimento.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de setembro de 2012 16:53
    Moderador
  • Eu preciso apenas fazer esse comando funcionar na parte do if

    SELECT

    DISTINCT TOP (100) PERCENT dbo.tblWRIRecepcao.PK_Recepcao AS Recepcao, dbo.tblWRIAndamentos.Observacao AS Data_Prevista

    FROM

    dbo.tblWRIAndamentos INNER JOIN

    dbo

    .tblWRIAtosTitulos ON dbo.tblWRIAtosTitulos.FK_tblWRIRecepcaoRecepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao INNER JOIN

    dbo

    .tblWRIRecepcao ON dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao LEFT OUTER JOIN

    dbo

    .tblWRIAtos ON dbo.tblWRIAtos.PK_Id = dbo.tblWRIAtosTitulos.FK_tblWRIAtos_Id

    WHERE

    (dbo.tblWRIAndamentos.Observacao LIKE '%Data prevista%:' + CONVERT(char(10), GETDATE() - 1, 103) + '%') AND (dbo.tblWRIRecepcao.DtCancelamento IS NULL)

    and

    If DatePart(dw, @Data) = 1 Or DatePart(dw, @Data) = 7

    ORDER

    BY Recepcao

    segunda-feira, 10 de setembro de 2012 17:09
  • Use Case.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de setembro de 2012 17:54
    Moderador
  • Segue exemplo.

    Observação: onde estou usando o campo chamado "Data" você usará GetDate().

    Declare @Datas Table (Data DateTime) 
    Insert Into @Datas Values ('07/09/2012'), ('08/09/2012'), ('09/09/2012'), ('10/09/2012'), ('11/09/2012')
    
    Select
      DataCadastrada = Data,
      DataAnterior = Case
                       When DatePart(weekday, Data - 1) = 1 Then
    				     Data - 2
    				   Else
    				     Data - 1
    				 End
    From
      @Datas


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de setembro de 2012 17:58
    Moderador
  • Mas eu nao sei se os dias vao ser 07/09, 08/09, 10/09

    pode ser qualquer dia

    segunda-feira, 10 de setembro de 2012 18:42
  • Sim, amigo. Por isso que eu disse que você deve trocar o campo "Data" que eu usei pela função GetDate, mencionada por você na abertura da Thread:

    Case
      When DatePart(weekday, GetDate() - 1) = 2 Then
        GetDate() - 2
      Else
        GetDate() - 1
    End

    Se o dia anterior for domingo, retorna sábado. Senão, retorna o próprio dia anterior.

    Se quiser que retorne só de segunda à sexta, você vai mexendo nesse código, montando o que precisa.

    Outro exemplo:

    Case
      When DatePart(weekday, GetDate() - 1) = 1 Then
        GetDate() - 2
      When DatePart(weekday, GetDate() - 1) = 2 Then
        GetDate() - 3
      Else
        GetDate() - 1
    End

    O código acima retorna:

    • Sexta-feira quando o dia atual é domingo;
    • Sexta-feira quando o dia atual é segunda;
    • Para qualquer outro dia, retorna o dia anterior.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    segunda-feira, 10 de setembro de 2012 18:51
    Moderador