Usuário com melhor resposta
Calculo de dias

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.
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
- Editado Wanderson de Paula quarta-feira, 11 de setembro de 2013 18:14 Removi meu nome duplicado
- Sugerido como Resposta Leonardo Lourenço Silva quarta-feira, 11 de setembro de 2013 18:14
- Marcado como Resposta welington jrModerator segunda-feira, 5 de março de 2018 11:38
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
- Editado Wanderson de Paula quarta-feira, 11 de setembro de 2013 18:14 Removi meu nome duplicado
- Sugerido como Resposta Leonardo Lourenço Silva quarta-feira, 11 de setembro de 2013 18:14
- Marcado como Resposta welington jrModerator segunda-feira, 5 de março de 2018 11:38
-
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
-
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- Sugerido como Resposta Fulvio 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
-
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
Fúlvio Cezar Canducci Dias -
-