none
Calculo de dias RRS feed

  • Pergunta

  • Ola em minha intranet, fazemos um calculo da quantidade de dias dentre um determinado intervalo, para tal temos o campo

    Data_Abertura e Data_Fechamento . Utilizei o DateDIff do VB.net para obter o intervalo de dias dentro do meu LinqToSql. Mas precisamos realizar este calculo sem somar os sábados e domingos, ou seja preciso calcular o intervalo de dias sem os finais de semana se alguém souber como posso fazer isto no LinqToSql.

    quarta-feira, 11 de setembro de 2013 18:00

Respostas

  • Olá Tiago,

    boa tarde.

    Utilizo a seguinte função C# para tal cálculo:

     public int DiferencaDiasUteis(DateTime dataInicio, DateTime dataFim)
            {
                int days = 0;
                int daysCount = 0;
                days = dataInicio.Subtract(dataFim).Days;
                 
                if (days < 0)
                    days = days * -1;
    
                for (int i = 1; i <= days; i++)
                {
                    dataInicio = dataInicio.AddDays(1); 
                    if (dataInicio.DayOfWeek != DayOfWeek.Sunday && dataInicio.DayOfWeek != DayOfWeek.Saturday)
                        daysCount++;
                }
                return daysCount;
            }

    Espero que ajude.

    Att., 


    Wanderson de Paula


    quarta-feira, 11 de setembro de 2013 18:14

Todas as Respostas

  • Olá Tiago,

    boa tarde.

    Utilizo a seguinte função C# para tal cálculo:

     public int DiferencaDiasUteis(DateTime dataInicio, DateTime dataFim)
            {
                int days = 0;
                int daysCount = 0;
                days = dataInicio.Subtract(dataFim).Days;
                 
                if (days < 0)
                    days = days * -1;
    
                for (int i = 1; i <= days; i++)
                {
                    dataInicio = dataInicio.AddDays(1); 
                    if (dataInicio.DayOfWeek != DayOfWeek.Sunday && dataInicio.DayOfWeek != DayOfWeek.Saturday)
                        daysCount++;
                }
                return daysCount;
            }

    Espero que ajude.

    Att., 


    Wanderson de Paula


    quarta-feira, 11 de setembro de 2013 18:14
  • A lógica que estou montando é muito parecida com a sua só que em VB, sem problemas quanto a linguagem, o problema é que preciso disto dentro de um linqToSQL, vou anexar o código para vc tentar entender melhor
    Function retornaDias(ByVal DataAbertura As String) As Integer
                Dim count As Integer = 0
                Dim totalDays = (Date.Now - CDate(DataAbertura)).Days
                Dim data As Date = CDate(DataAbertura)
    
                For i = 0 To totalDays
                    Dim weekday As DayOfWeek = data.AddDays(i).DayOfWeek
                    If weekday <> DayOfWeek.Saturday AndAlso weekday <> DayOfWeek.Sunday Then
                        count += 1
                    End If
                Next
    
                Return count
            End Function
    
    
    
    
    /////Abaixo segue o linqToSql
    Dim filtra = (From fc In filtraChamado
                 Select New With {.IDChamado = fc.IDChamado,
                 .DiferencaDias = - retornaDias(fc.DataAbertura)})
    
    
    só que o linq não aceita que retorne uma string ou  um inteiro para consulta

    quarta-feira, 11 de setembro de 2013 18:54
  • Diretamente no LinqToSql não vai rolar mesmo, porque ele não vai ter isso na SQL que vem da sua tabela do banco

    então faz assim:

    Cria sua lista normalmente e compile no final com ToList();

    Nessa lista se vai criar ai um LinqToObjects ai rola certinho com essa função ai!

    Exemplo do meu código:

    //linq to SQL
    var dados = dal.Reservas.Select(x => new
    {
      x.Id,
      x.Data_Inicio,
      x.Data_Fim
    }).ToList(); 
    
    //ai se vai para linq to Object
    var dadosFinal = dados.Select(x => new
    {
      x.Id,
      dias = DiffDatetoDay(x.Data_Inicio, x.Data_Fim)
    }).ToList();
    
    //Minha função que eu acabei fazendo rapido num console application
    static int DiffDatetoDay(DateTime Begin, DateTime End)
    {
                int days = 0;
                for(DateTime Start = Begin; Start <= End; Start = Start.AddDays(1))
                {
                    if (Start.DayOfWeek != DayOfWeek.Saturday && Start.DayOfWeek != DayOfWeek.Sunday)
                    {
                        days++;
                    }
                }
                return days;
    }


    Fúlvio Cezar Canducci Dias

    quarta-feira, 11 de setembro de 2013 19:49
  • Quase deu certo. mas o problema agora é que utilizo o linq que me retornou os dias para fazer outras consultas.

    Estou postando o código. E um print do erro que me retornou

    Public Function ChamadosNaoConcluidos(Status As String, NivelAtendimento As String, DropRevendaIndex As String, DiasAtendimento As String)
                Dim arrDadosUsuario As New ArrayList
                arrDadosUsuario = Session("ListaDados")
                arrVerificaLogado = Session("ListaDados")
    
                If insValidaUsuario.UsuarioLogado Then
                    arrVerificaLogado = Nothing
    
                    If arrDadosUsuario.Item(0).ToString = "Administrador" Then
    
                        Dim filtraChamado = (From ct In db.Chamados
                                            Select ct).ToList
    
                        'Dim filtra = (From fc In filtraChamado
                        '             Select New With {
                        '                 .IDChamado = fc.IDChamado,
                        '                 .DiferencaDias = System.Data.Objects.SqlClient.SqlFunctions.DateDiff("DAY", fc.DataAbertura, Date.Now)}).ToList()
    
                        '''''''linq to SQL'''''''
                        Dim filtraDados = (From fc In filtraChamado
                                     Select New With {
                                         .IDChamado = fc.IDChamado,
                                         .Data_Inicio = fc.DataAbertura,
                                         .Data_Fim = Date.Now}).ToList()
    
    
                        '''''''linq to Object'''''''
                        Dim filtra = (From fc In filtraDados
                                     Select New With {
                                         .IDChamado = fc.IDChamado,
                                         .DiferencaDias = CStr(ReturnDays(fc.Data_Inicio, fc.Data_Fim))}).ToList()
    
    
                        Dim chamado = (From c In db.Chamados).ToList()
                        Dim cliente = (From c In db.Clientes).ToList()
                        Dim revenda = (From c In db.Revendas).ToList()
                        Dim ChamadoProspecao = (From c In db.ChamadoProspeccoes).ToList()
    
    
                        Dim RecuperaChamados = (From c In chamado
                                                Join f In filtra On f.IDChamado Equals c.IDChamado
                                                Where c.Status = "Aberto" Or c.Status = "Pendente" Or c.Status = "Prospectado"
                                            Group Join cl In cliente
                                                On cl.IDCliente Equals c.IDCliente
                                                Into ChildrenC = Group
                                                From children In ChildrenC.DefaultIfEmpty()
                                            Group Join r In revenda
                                                On r.IDRevenda Equals children.IDRevenda
                                                Into ChildrenR = Group
                                                From childrenre In ChildrenR.DefaultIfEmpty()
                                            Group Join cp In ChamadoProspecao
                                                On cp.IDChamado Equals c.IDChamado
                                                Into ChildrenCP = Group
                                                From childrencpr In ChildrenCP.DefaultIfEmpty()
                                            Group Join fct In filtra
                                                On fct.IDChamado Equals c.IDChamado
                                                Into ChildrenCT = Group
                                                From childrenfct In ChildrenCT.DefaultIfEmpty()
                                                Select New With {
                                                    .IDChamado = c.IDChamado,
                                                    .Revenda = childrenre.NomeFantasia,
                                                    .Cliente = children.NomeFantasia,
                                                    .Contato = c.PessoaContato,
                                                    .Telefone = children.Telefone,
                                                    .DataAbertura = c.DataAbertura,
                                                    .Status = c.Status,
                                                    .NivelAtendimento = childrencpr.NivelAtendimento,
                                                    .NumeroDiasSemAtendimentos = childrenfct.DiferencaDias})
    
    
    
    
    
                        'Dim RecuperaChamados = (From c In db.Chamados
                        '                        Join f In filtra On f.IDChamado Equals c.IDChamado
                        '                    Group Join cl In db.Clientes
                        '                        On cl.IDCliente Equals c.IDCliente
                        '                        Into ChildrenC = Group
                        '                        From children In ChildrenC.DefaultIfEmpty()
                        '                    Group Join r In db.Revendas
                        '                        On r.IDRevenda Equals children.IDRevenda
                        '                        Into ChildrenR = Group
                        '                        From childrenre In ChildrenR.DefaultIfEmpty()
                        '                    Group Join cp In db.ChamadoProspeccoes
                        '                        On cp.IDChamado Equals c.IDChamado
                        '                        Into ChildrenCP = Group
                        '                        From childrencpr In ChildrenCP.DefaultIfEmpty()
                        '                    Group Join fct In filtra
                        '                        On fct.IDChamado Equals c.IDChamado
                        '                        Into ChildrenCT = Group
                        '                        From childrenfct In ChildrenCT.DefaultIfEmpty()
                        '                        Select New With {
                        '                            .IDChamado = c.IDChamado,
                        '                            .Revenda = childrenre.NomeFantasia,
                        '                            .Cliente = children.NomeFantasia,
                        '                            .Contato = c.PessoaContato,
                        '                            .Telefone = children.Telefone,
                        '                            .DataAbertura = c.DataAbertura,
                        '                            .Status = c.Status,
                        '                            .NivelAtendimento = childrencpr.NivelAtendimento,
                        '                            .NumeroDiasSemAtendimentos = childrenfct.DiferencaDias})
    
    
                        'Dim RecuperaChamadosFiltra = (From rc In RecuperaChamados Where rc.Status = "Aberto" Or
                        '                                rc.Status = "Pendente" Or
                        '                                rc.Status = "Prospectado"
                        '                                Select rc Order By rc.IDChamado Descending)
    
                        ViewBag.Chamados = RecuperaChamados
    
    
                        Dim query = RecuperaChamados.AsQueryable()
                        If (Not IsNothing(Status) And Status <> "") Or (Not IsNothing(NivelAtendimento) And NivelAtendimento <> "") _
                            Or (Not IsNothing(DropRevendaIndex) And DropRevendaIndex <> "") Or (Not IsNothing(DiasAtendimento) And DiasAtendimento <> "") Then
    
                            Dim StatusFiltro As String = Status
                            Dim NivelAtendimentoFiltro As String = NivelAtendimento
                            Dim DropRevendaIndexFiltro As String = DropRevendaIndex
                            Dim DiasAtendimentoFiltro As String = DiasAtendimento
    
                            If (Not IsNothing(StatusFiltro) And StatusFiltro <> "") Then
                                query = query.Where(Function(o) o.Status = StatusFiltro)
                            End If
    
                            If (Not IsNothing(NivelAtendimentoFiltro) And NivelAtendimentoFiltro <> "") Then
                                query = query.Where(Function(o) o.NivelAtendimento = NivelAtendimentoFiltro)
                            End If
    
                            If (Not IsNothing(DropRevendaIndexFiltro) And DropRevendaIndexFiltro <> "") Then
                                query = query.Where(Function(o) o.Revenda = DropRevendaIndexFiltro)
                            End If
    
                            If (Not IsNothing(DiasAtendimentoFiltro) And DiasAtendimentoFiltro <> "") Then
    
    
                                Select Case DiasAtendimentoFiltro
                                    Case "1"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos <= 1)
    
                                    Case "2"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 1 And o.NumeroDiasSemAtendimentos <= 2)
    
                                    Case "5"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 3 And o.NumeroDiasSemAtendimentos <= 5)
    
                                    Case "10"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 6 And o.NumeroDiasSemAtendimentos <= 10)
    
                                    Case "15"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 11 And o.NumeroDiasSemAtendimentos <= 15)
    
                                    Case "30"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 16 And o.NumeroDiasSemAtendimentos <= 30)
    
                                    Case Is = "Acima de 30"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos > 31)
    
                                End Select
                            End If
    
                            ViewBag.Chamados = query
                        End If
    
                        Return View()
                    Else
    
                        Return RedirectToAction("SemAutorizacao", "Home")
                    End If
                End If
            End Function

    quinta-feira, 12 de setembro de 2013 17:58
  • Quase deu certo. mas o problema agora é que utilizo o linq que me retornou os dias para fazer outras consultas.

    Estou postando o código. E um print do erro que me retornou

    Public Function ChamadosNaoConcluidos(Status As String, NivelAtendimento As String, DropRevendaIndex As String, DiasAtendimento As String)
                Dim arrDadosUsuario As New ArrayList
                arrDadosUsuario = Session("ListaDados")
                arrVerificaLogado = Session("ListaDados")
    
                If insValidaUsuario.UsuarioLogado Then
                    arrVerificaLogado = Nothing
    
                    If arrDadosUsuario.Item(0).ToString = "Administrador" Then
    
                        Dim filtraChamado = (From ct In db.Chamados
                                            Select ct).ToList
    
                        'Dim filtra = (From fc In filtraChamado
                        '             Select New With {
                        '                 .IDChamado = fc.IDChamado,
                        '                 .DiferencaDias = System.Data.Objects.SqlClient.SqlFunctions.DateDiff("DAY", fc.DataAbertura, Date.Now)}).ToList()
    
                        '''''''linq to SQL'''''''
                        Dim filtraDados = (From fc In filtraChamado
                                     Select New With {
                                         .IDChamado = fc.IDChamado,
                                         .Data_Inicio = fc.DataAbertura,
                                         .Data_Fim = Date.Now}).ToList()
    
    
                        '''''''linq to Object'''''''
                        Dim filtra = (From fc In filtraDados
                                     Select New With {
                                         .IDChamado = fc.IDChamado,
                                         .DiferencaDias = CStr(ReturnDays(fc.Data_Inicio, fc.Data_Fim))}).ToList()
    
    
                        Dim chamado = (From c In db.Chamados).ToList()
                        Dim cliente = (From c In db.Clientes).ToList()
                        Dim revenda = (From c In db.Revendas).ToList()
                        Dim ChamadoProspecao = (From c In db.ChamadoProspeccoes).ToList()
    
    
                        Dim RecuperaChamados = (From c In chamado
                                                Join f In filtra On f.IDChamado Equals c.IDChamado
                                                Where c.Status = "Aberto" Or c.Status = "Pendente" Or c.Status = "Prospectado"
                                            Group Join cl In cliente
                                                On cl.IDCliente Equals c.IDCliente
                                                Into ChildrenC = Group
                                                From children In ChildrenC.DefaultIfEmpty()
                                            Group Join r In revenda
                                                On r.IDRevenda Equals children.IDRevenda
                                                Into ChildrenR = Group
                                                From childrenre In ChildrenR.DefaultIfEmpty()
                                            Group Join cp In ChamadoProspecao
                                                On cp.IDChamado Equals c.IDChamado
                                                Into ChildrenCP = Group
                                                From childrencpr In ChildrenCP.DefaultIfEmpty()
                                            Group Join fct In filtra
                                                On fct.IDChamado Equals c.IDChamado
                                                Into ChildrenCT = Group
                                                From childrenfct In ChildrenCT.DefaultIfEmpty()
                                                Select New With {
                                                    .IDChamado = c.IDChamado,
                                                    .Revenda = childrenre.NomeFantasia,
                                                    .Cliente = children.NomeFantasia,
                                                    .Contato = c.PessoaContato,
                                                    .Telefone = children.Telefone,
                                                    .DataAbertura = c.DataAbertura,
                                                    .Status = c.Status,
                                                    .NivelAtendimento = childrencpr.NivelAtendimento,
                                                    .NumeroDiasSemAtendimentos = childrenfct.DiferencaDias})
    
    
    
    
    
                        'Dim RecuperaChamados = (From c In db.Chamados
                        '                        Join f In filtra On f.IDChamado Equals c.IDChamado
                        '                    Group Join cl In db.Clientes
                        '                        On cl.IDCliente Equals c.IDCliente
                        '                        Into ChildrenC = Group
                        '                        From children In ChildrenC.DefaultIfEmpty()
                        '                    Group Join r In db.Revendas
                        '                        On r.IDRevenda Equals children.IDRevenda
                        '                        Into ChildrenR = Group
                        '                        From childrenre In ChildrenR.DefaultIfEmpty()
                        '                    Group Join cp In db.ChamadoProspeccoes
                        '                        On cp.IDChamado Equals c.IDChamado
                        '                        Into ChildrenCP = Group
                        '                        From childrencpr In ChildrenCP.DefaultIfEmpty()
                        '                    Group Join fct In filtra
                        '                        On fct.IDChamado Equals c.IDChamado
                        '                        Into ChildrenCT = Group
                        '                        From childrenfct In ChildrenCT.DefaultIfEmpty()
                        '                        Select New With {
                        '                            .IDChamado = c.IDChamado,
                        '                            .Revenda = childrenre.NomeFantasia,
                        '                            .Cliente = children.NomeFantasia,
                        '                            .Contato = c.PessoaContato,
                        '                            .Telefone = children.Telefone,
                        '                            .DataAbertura = c.DataAbertura,
                        '                            .Status = c.Status,
                        '                            .NivelAtendimento = childrencpr.NivelAtendimento,
                        '                            .NumeroDiasSemAtendimentos = childrenfct.DiferencaDias})
    
    
                        'Dim RecuperaChamadosFiltra = (From rc In RecuperaChamados Where rc.Status = "Aberto" Or
                        '                                rc.Status = "Pendente" Or
                        '                                rc.Status = "Prospectado"
                        '                                Select rc Order By rc.IDChamado Descending)
    
                        ViewBag.Chamados = RecuperaChamados
    
    
                        Dim query = RecuperaChamados.AsQueryable()
                        If (Not IsNothing(Status) And Status <> "") Or (Not IsNothing(NivelAtendimento) And NivelAtendimento <> "") _
                            Or (Not IsNothing(DropRevendaIndex) And DropRevendaIndex <> "") Or (Not IsNothing(DiasAtendimento) And DiasAtendimento <> "") Then
    
                            Dim StatusFiltro As String = Status
                            Dim NivelAtendimentoFiltro As String = NivelAtendimento
                            Dim DropRevendaIndexFiltro As String = DropRevendaIndex
                            Dim DiasAtendimentoFiltro As String = DiasAtendimento
    
                            If (Not IsNothing(StatusFiltro) And StatusFiltro <> "") Then
                                query = query.Where(Function(o) o.Status = StatusFiltro)
                            End If
    
                            If (Not IsNothing(NivelAtendimentoFiltro) And NivelAtendimentoFiltro <> "") Then
                                query = query.Where(Function(o) o.NivelAtendimento = NivelAtendimentoFiltro)
                            End If
    
                            If (Not IsNothing(DropRevendaIndexFiltro) And DropRevendaIndexFiltro <> "") Then
                                query = query.Where(Function(o) o.Revenda = DropRevendaIndexFiltro)
                            End If
    
                            If (Not IsNothing(DiasAtendimentoFiltro) And DiasAtendimentoFiltro <> "") Then
    
    
                                Select Case DiasAtendimentoFiltro
                                    Case "1"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos <= 1)
    
                                    Case "2"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 1 And o.NumeroDiasSemAtendimentos <= 2)
    
                                    Case "5"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 3 And o.NumeroDiasSemAtendimentos <= 5)
    
                                    Case "10"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 6 And o.NumeroDiasSemAtendimentos <= 10)
    
                                    Case "15"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 11 And o.NumeroDiasSemAtendimentos <= 15)
    
                                    Case "30"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos >= 16 And o.NumeroDiasSemAtendimentos <= 30)
    
                                    Case Is = "Acima de 30"
    
                                        query = query.Where(Function(o) o.NumeroDiasSemAtendimentos > 31)
    
                                End Select
                            End If
    
                            ViewBag.Chamados = query
                        End If
    
                        Return View()
                    Else
    
                        Return RedirectToAction("SemAutorizacao", "Home")
                    End If
                End If
            End Function

    Então qual(IS) dos itens está NULL OU IS NOTHING?

    Fúlvio Cezar Canducci Dias

    quinta-feira, 12 de setembro de 2013 18:54
  • dentro do select new with o unico valor que aparece para mim é a DiferencaDias
    sexta-feira, 13 de setembro de 2013 17:08
  • alguem?
    terça-feira, 24 de setembro de 2013 11:08