Visual Studio >
Fóruns do Visual Studio
>
C#
>
Adicionar intervalo em minutos em uma variavel TimeSpan
Adicionar intervalo em minutos em uma variavel TimeSpan
- 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
- Veja se resolve:
codigo .aspx
codigo .cs<%@ 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>
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
- Marcado como RespostaAnderson_Pasqualini quarta-feira, 4 de novembro de 2009 15:08
Todas as Respostas
- 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 - 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 - 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- Sugerido como RespostaHarley AraujoMSFT, Moderadorterça-feira, 3 de novembro de 2009 17:25
- 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)
Porém na hora que vou converter para passar o parâmetro aparece o erro:
{
int i = 1;
while (h1 < t1)
{
ddlHora.Items.Insert(i, h1.ToShortTimeString());
h1 = h1.AddMinutes(inter);
i++;
}
}
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 - Veja se resolve:
codigo .aspx
codigo .cs<%@ 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>
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
- Marcado como RespostaAnderson_Pasqualini quarta-feira, 4 de novembro de 2009 15:08
- 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


