Visual Studio > Fóruns do Visual Studio > C# > Adicionar intervalo em minutos em uma variavel TimeSpan
Fazer uma PerguntaFazer uma Pergunta
 

RespondidoAdicionar intervalo em minutos em uma variavel TimeSpan

  • sexta-feira, 30 de outubro de 2009 11:36Anderson_Pasqualini Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Ola pessoal não sei mais o que tentar para conseguir fazer esta rotina abaixo:

    Estou desenvolvendo um sistema para uma clinica médica de um conhecido.

    Tenho 2 campos no sql server 2008 do tipo Time, hora inicial e hora final. Tenho também um campo do tipo int, que é o intervalo entre as consultas em minutos. 

    Como posso fazer para calcular os horarios de atendimento pegando a hora inicial e adicionando o intervalo (minutos) até chegar na hora final.

    Por favor me ajudem...

    Obrigado

    Anderson

Respostas

  • terça-feira, 3 de novembro de 2009 19:48Ramon B. Lima Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     RespondidoContém Código
    Veja se resolve:

    codigo .aspx

    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <style type="text/css">
        .class1
        {
            background-color:Blue;
        }
        .class2
        {
            background-color:Red;
        }
        
        </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            Horario inicial:
            <asp:TextBox ID="TextBox1" runat="server">08:00:00</asp:TextBox>
            <br />
            Horario final:
            <asp:TextBox ID="TextBox2" runat="server">00:15:00</asp:TextBox>
            <br />
            Intervalo:
            <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
            <br />
            <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
            <br />
            <br />
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
            <br />
        </div>
        </form>
    </body>
    </html>
    
    
    codigo .cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Data;
    
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            HorarioAtendimento horario = new HorarioAtendimento(TimeSpan.Parse("08:00:00"), TimeSpan.Parse("09:00:00"), TimeSpan.Parse("00:15:00"));
    
            GridView1.DataSource = horario.ObtemHorarios();
    
            GridView1.DataBind();
    
    
        }
    }
    public static class Extension
    {
        public static double ToDouble(this TimeSpan time)
        {
            try
            {
                int hour = 0;
                int minutes = 0;
                int second = 0;
                int returnValue = 0;
                hour = time.Hours;
                minutes = time.Minutes;
                second = time.Seconds;
    
                returnValue += hour * 3600;
                returnValue += minutes * 60;
                returnValue += second;
    
                return returnValue;
            }
            catch (Exception ex)
            {
                throw new Exception("ToTimeInt32 error: " + ex.Message);
            }
        }
    }
    public class HorarioAtendimento
    {
        public TimeSpan Inicio { get; set; }
        public TimeSpan Fim { get; set; }
        public TimeSpan Intervalo { get; set; }
    
        public HorarioAtendimento(TimeSpan inicio, TimeSpan fim, TimeSpan intervalo)
        {
            Inicio = inicio;
            Fim = fim;
            Intervalo = intervalo;
        }
    
        public DataTable ObtemHorarios()
        {
            DataTable dt = new DataTable();
            DataColumn columns = new DataColumn();
    
            columns.ColumnName = "Inicio";
    
            dt.Columns.Add(columns);
    
            columns = new DataColumn();
    
            columns.ColumnName = "Fim";
    
            dt.Columns.Add(columns);
    
            double totalExpediente = (Fim-Inicio).ToDouble();
            double intervaloDouble = Intervalo.ToDouble();
            TimeSpan aux = Inicio;
            while (totalExpediente > 0)
            {
                totalExpediente -= intervaloDouble;
                DataRow dr = dt.NewRow();
    
                dr["Inicio"] = aux;
    
                aux+= Intervalo;
    
                dr["Fim"] = aux;
    
                dt.Rows.Add(dr);
            }
            return dt;
        }
    }
    
    

    Nem testei =P

    Veja,

    eu faço a conversao dos horarios para inteiros e trabalho com ele no while, pode ser que isso nao funcione como queira, mas tente absorver a ideia.



    Abraço
    _____
    Se respondeu por favor marque como
    Ramon B. Lima

Todas as Respostas

  • sexta-feira, 30 de outubro de 2009 11:57Ramon B. Lima Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Contém Código
    Boa dia,

    nao entendi muito bem sua pergunta, voce quer pegar o tempo de atendimento de uma consulta?

    veja se é assim codigo c#:

            TimeSpan inicio_atendimento = TimeSpan.Parse("08:30:21");
            TimeSpan final_atendimento = TimeSpan.Parse("09:01:11");
    
    
            Response.Write(final_atendimento - inicio_atendimento);
    

    caso nao explique melhor sua necessidade =)

    Abraço
  • sexta-feira, 30 de outubro de 2009 17:03Anderson_Pasqualini Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Ola Ramon, não é isso, o que preciso é seguinte, o administrador vai parametrizar os dados da agenda do médico, informando a hora de início, hora de término que o médico trabalha e o intervalo entre as consultas. Isso em uma tabela de configuração da agenda.

    Na agenda, preciso pegar os valores de inínio e término e montar montar os horários possiveis das consultas.

    Ex: Hora inínio: 09:00, término: 10:00, intervalo: 15 min.

    Em um ddl tem montar os horários: 09.00, 09.15, 09.30, 09.45 e 10.00

    estava pensando em fazer:

    while(hora1 < hora2)
    {
          hora1=hora1+intervalo;
          ddlhora.item.insert(i, hora1);
          i++;
    }

    Seria +- isso que quero. Ficou meio confusso...

    Obrigado

    Anderson



  • sexta-feira, 30 de outubro de 2009 21:48MárcioLima Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Resposta PropostaContém Código
    Olá Anderson,

    Analise o exemplo:

            private void btnAgenda_Click(object sender, EventArgs e)
            {
                DateTime hrInicio, hrFinal;
                hrInicio = Convert.ToDateTime(txtInicio.Text);
                hrFinal = Convert.ToDateTime(txtFinal.Text);
                double minutos = Convert.ToDouble(txtIntervalo.Text);
                while (hrInicio < hrFinal)
                {
                    listBox1.Items.Add(hrInicio.ToShortTimeString());
                    hrInicio = hrInicio.AddMinutes(minutos);
                }
            }
    
    


    Saudações

    Márcio Lima
  • terça-feira, 3 de novembro de 2009 9:52Anderson_Pasqualini Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     
    Ola Marcos, eu fiz o seguinte:

    DateTime

     

    h1 = Convert.ToDateTime(dados.IniSex1.Value);
    DateTime t1 = Convert.ToDateTime(dados.TermSex1.Value);
    int Inter = dados.InterSex.Value;
    carregaHorario(h1,t1,Inter);

    private

     

    void carregaHorario(DateTime h1, DateTime t1, int inter)
    {
    int i = 1;
    while (h1 < t1)
    {
    ddlHora.Items.Insert(i, h1.ToShortTimeString());
    h1 = h1.AddMinutes(inter);
    i++;
    }
    }

    Porém na hora que vou converter para passar o parâmetro aparece o erro:

    Não é possível converter um objeto do tipo 'System.TimeSpan' no tipo 'System.IConvertible'.

    Sendo que no banco de dados as horas são armazenadas no tipo TIME, estou usando o sql server 2008 express.

    Como será que posso resolver isso?

    Obrigado,

    Anderson Pasqualini
  • terça-feira, 3 de novembro de 2009 19:48Ramon B. Lima Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     RespondidoContém Código
    Veja se resolve:

    codigo .aspx

    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <style type="text/css">
        .class1
        {
            background-color:Blue;
        }
        .class2
        {
            background-color:Red;
        }
        
        </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            Horario inicial:
            <asp:TextBox ID="TextBox1" runat="server">08:00:00</asp:TextBox>
            <br />
            Horario final:
            <asp:TextBox ID="TextBox2" runat="server">00:15:00</asp:TextBox>
            <br />
            Intervalo:
            <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
            <br />
            <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
            <br />
            <br />
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
            <br />
        </div>
        </form>
    </body>
    </html>
    
    
    codigo .cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Data;
    
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            HorarioAtendimento horario = new HorarioAtendimento(TimeSpan.Parse("08:00:00"), TimeSpan.Parse("09:00:00"), TimeSpan.Parse("00:15:00"));
    
            GridView1.DataSource = horario.ObtemHorarios();
    
            GridView1.DataBind();
    
    
        }
    }
    public static class Extension
    {
        public static double ToDouble(this TimeSpan time)
        {
            try
            {
                int hour = 0;
                int minutes = 0;
                int second = 0;
                int returnValue = 0;
                hour = time.Hours;
                minutes = time.Minutes;
                second = time.Seconds;
    
                returnValue += hour * 3600;
                returnValue += minutes * 60;
                returnValue += second;
    
                return returnValue;
            }
            catch (Exception ex)
            {
                throw new Exception("ToTimeInt32 error: " + ex.Message);
            }
        }
    }
    public class HorarioAtendimento
    {
        public TimeSpan Inicio { get; set; }
        public TimeSpan Fim { get; set; }
        public TimeSpan Intervalo { get; set; }
    
        public HorarioAtendimento(TimeSpan inicio, TimeSpan fim, TimeSpan intervalo)
        {
            Inicio = inicio;
            Fim = fim;
            Intervalo = intervalo;
        }
    
        public DataTable ObtemHorarios()
        {
            DataTable dt = new DataTable();
            DataColumn columns = new DataColumn();
    
            columns.ColumnName = "Inicio";
    
            dt.Columns.Add(columns);
    
            columns = new DataColumn();
    
            columns.ColumnName = "Fim";
    
            dt.Columns.Add(columns);
    
            double totalExpediente = (Fim-Inicio).ToDouble();
            double intervaloDouble = Intervalo.ToDouble();
            TimeSpan aux = Inicio;
            while (totalExpediente > 0)
            {
                totalExpediente -= intervaloDouble;
                DataRow dr = dt.NewRow();
    
                dr["Inicio"] = aux;
    
                aux+= Intervalo;
    
                dr["Fim"] = aux;
    
                dt.Rows.Add(dr);
            }
            return dt;
        }
    }
    
    

    Nem testei =P

    Veja,

    eu faço a conversao dos horarios para inteiros e trabalho com ele no while, pode ser que isso nao funcione como queira, mas tente absorver a ideia.



    Abraço
    _____
    Se respondeu por favor marque como
    Ramon B. Lima

  • terça-feira, 3 de novembro de 2009 22:46MárcioLima Medalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuárioMedalhas de usuário
     Contém Código
    Olá Anderson,

    O erro é referente à conversão do TIME do Banco para DateTime.

    Altere o seu código para trabalhar com TimeSpan, como segue:

    TimeSpan h1 = dados.IniSex1.Value;
    TimeSpan t1 = dados.TermSex1.Value;
    TimeSpan Inter = TimeSpan.FromMinutes(dados.InterSex.Value);
    carregaHorario(h1,t1,Inter);
    
    private
    
    void carregaHorario(TimeSpan h1, TimeSpan t1, TimeSpan inter)
    {
    int i = 1;
    while (h1 < t1)
    {
    ddlHora.Items.Insert(i, h1.ToString());
    h1 = h1.Add(inter);
    i++;
    } 
    }
    
    


    Saudações
    Márcio Lima