elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  ¿ Se puede hacer esta consulta de fechas ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿ Se puede hacer esta consulta de fechas ?  (Leído 4,726 veces)
ostrede

Desconectado Desconectado

Mensajes: 4


Ver Perfil
¿ Se puede hacer esta consulta de fechas ?
« en: 14 Agosto 2013, 02:58 am »

Hola, quiero hacer una consulta en vbnet de un intervalo de fechas. Quiero que me diga tal como lo siguiente:

Function sTiempo(dInicio As Date, dFin As Date) As String
sTiempo = Str((DateDiff("s", dInicio, dFin) \ 86400) Mod 365) & " días, "
sTiempo = sTiempo & Str((DateDiff("s", dInicio, dFin) \ 3600) Mod 24) & " horas, "
sTiempo = sTiempo & Str((DateDiff("s", dInicio, dFin) \ 60) Mod 60) & " minutos, "
sTiempo = sTiempo & Str(DateDiff("s", dInicio, dFin) Mod 60) & " segundos."
End Function


Lo que hace es calcular la diferencia en segundos y después ajustarla a dias, horas...

p.e. Imaginemos que en un TextBox (Text1) tienes una fecha en este formato "25/07/2007 15:00:00" y en otro (Text2) lo siguiente "26/07/2007 17:25:32"

Si haces una llamada a la función así:
Variable = sTiempo(Text1, Text2)
retornará la cadena "1 días, 2 horas, 25 minutos, 32 segundos."

Pero yo quiero que el intervalo me diga los meses, semanas y días.
Por ejemplo del 01/03/2013 al 10/04/2013 y me diga que hay 1 MES, 1 SEMANA y 3 DÍAS.


¿Se podría hacer?


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #1 en: 14 Agosto 2013, 10:18 am »

¿Se podría hacer?

Así lo hice yo:

EDITO: He extendido la función para obtener horas, minutos y segundos.

Código
  1. #Region " Date Difference "
  2.  
  3.    ' Date Difference
  4.    '
  5.    ' // By Elektro H@cker
  6.    '
  7.    ' Examples :
  8.    '
  9.    ' MsgBox(DateDifference(DateTime.Parse("01/03/2013"), DateTime.Parse("10/04/2013"))) ' Result: 1 Months, 1 Weeks, 2 Days, 0 Hours, 0 Minutes and 0 Seconds
  10.    ' MsgBox(DateDifference(DateTime.Parse("01/01/2013 14:00:00"), DateTime.Parse("02/01/2013 15:00:30"))) ' Result: 0 Months, 0 Weeks, 1 Days, 1 Hours, 0 Minutes and 30 Seconds
  11.  
  12.    Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
  13.  
  14.        Dim MonthDiff As String, WeekDiff As String, _
  15.            DayDiff As String, HourDiff As String, _
  16.            MinuteDiff As String, SecondDiff As String
  17.  
  18.        MonthDiff = Convert.ToString(DateDiff("M", Date1, Date2))
  19.        WeekDiff = Convert.ToString(DateDiff("d", Date1.AddMonths(DateDiff("M", Date1, Date2)), Date2) \ 7)
  20.        DayDiff = Convert.ToString(DateDiff("d", Date1.AddMonths(DateDiff("M", Date1, Date2)), Date2) - (WeekDiff * 7))
  21.        HourDiff = Convert.ToString(DateDiff("h", Date1.AddHours(DateDiff("h", Date1, Date2)), Date2) - (Date1.Hour - Date2.Hour))
  22.        MinuteDiff = Convert.ToString(DateDiff("n", Date1.AddMinutes(DateDiff("n", Date1, Date2)), Date2) - (Date1.Minute - Date2.Minute))
  23.        SecondDiff = Convert.ToString(DateDiff("s", Date1.AddSeconds(DateDiff("s", Date1, Date2)), Date2) - (Date1.Second - Date2.Second))
  24.  
  25.        Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
  26.                             MonthDiff, WeekDiff, DayDiff, HourDiff, MinuteDiff, SecondDiff)
  27.  
  28.    End Function
  29.  
  30. #End Region

PD: Mi función no cuenta el primer día restante porque me parece incorrecto, del 1 al 7 no hay 7 días de diferencia, hay 6, si quieres obtener el resultado que comentas pues símplemente añade un "+ 1" a la diferencia de días.

Saludos!


« Última modificación: 14 Agosto 2013, 10:56 am por EleKtro H@cker » En línea



ostrede

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #2 en: 15 Agosto 2013, 20:17 pm »

He probado el código pero cuando pongo por ejemplo del 15/08/2013 al 02/09/2013 me tira lo siguiente:

1 Months, -1 Weeks, -6 Days, 0 Hours, 0 Minutes and 0 Seconds

Debería decirme 2 semanas y 4 días.

No sé porqué sale la resta negativa y cómo solucionarlo.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #3 en: 15 Agosto 2013, 20:47 pm »

No me habia dado ningún error por el momento, pero vaya, tienes razón.

No se si podré solucionarlo, ya investigaré

saludos
En línea



Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #4 en: 15 Agosto 2013, 21:35 pm »

Es reálmente necesario obtener el valor de las semanas?, los formatos de string standard de un DateTime no pueden obtener este valor...

Ahora lo he hecho de otra manera ya que el primer code no funcionaba con algunas fechas, pero el valor de las semanas no se me ocurre como obtenerlo:

CORREGIDO (eso creo, aun no he probado la modificación pero debería funcionar):
Código
  1.    Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
  2.  
  3.        Dim MonthDiff As Long , _
  4.           DayDiff As Long , HourDiff As Long , _
  5.           MinuteDiff As Long , SecondDiff As Long
  6.  
  7.        MonthDiff = Date2.Month - Date1.Month
  8.        DayDiff = Date2.Day - Date1.Day
  9.        HourDiff = Date2.Subtract(Date1).Hours
  10.        MinuteDiff = Date2.Subtract(Date1).Minutes
  11.        SecondDiff = Date2.Subtract(Date1).Seconds
  12.        'Dim MilliDiff As Long = Date2.Subtract(Date1).Milliseconds
  13.  
  14.        Return String.Format("{0} Months, {1} Days, {2} Hours, {3} Minutes and {4} Seconds", _
  15.                              MonthDiff, DayDiff, HourDiff, MinuteDiff, SecondDiff)
  16.  
  17.    End Function

Saludos.
« Última modificación: 15 Agosto 2013, 22:53 pm por EleKtro H@cker » En línea



Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #5 en: 15 Agosto 2013, 22:14 pm »

EleKtro H@cker, sin probarla, esa función no es correcta :P
¿Qué pasa si le paso como parámetros las fechas "01/01/2013 14:00:00" y "02/01/2013 13:00:30"?

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #6 en: 15 Agosto 2013, 22:50 pm »

EleKtro H@cker, sin probarla, esa función no es correcta :P
¿Qué pasa si le paso como parámetros las fechas "01/01/2013 14:00:00" y "02/01/2013 13:00:30"?

Saludos

Es verdad no me di cuenta, malditas "horas" xD

Bueno todo tiene solución, entonces hay que substraer en lugar de restar:

Código
  1.    Dim HourDiff As Long = Date2.Subtract(Date1).Hours
  2.    Dim MinuteDiff As Long = Date2.Subtract(Date1).Minutes
  3.    Dim SecondDiff As Long = Date2.Subtract(Date1).Seconds
  4.    Dim MilliDiff As Long = Date2.Subtract(Date1).Milliseconds

Llevo un lio tremendo para sacar la fecha con eficacia (por ejemplo entre meses como febrero con 28 días), el valor de las semanas se resiste, pero nadie tiene la solución: http://stackoverflow.com/questions/18259835/function-to-get-a-custom-date-difference

Saludos!
En línea



Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #7 en: 15 Agosto 2013, 23:03 pm »

A eso iba, cuando pasas al detalle de horas/minutos/segundos, entonces pasas a tener problemas a partir de los meses, porque un mes son 30,4368499 días según google :P

Había implementado un método pero tiene el mismo problema a partir del mes, por el tema de redondeo y demás (es el mismo método que se utiliza por ejemplo para dividir un importe en billetes).

Código
  1. public string DateDifference(DateTime dateStart, DateTime dateEnd)
  2. {
  3.    Dictionary<string, double> dateParts = new Dictionary<string, double>();
  4.    dateParts.Add("Years", 31556925.97632);
  5.    dateParts.Add("Months", 2629743.83136);
  6.    dateParts.Add("Weeks", 604800);
  7.    dateParts.Add("Days", 86400);
  8.    dateParts.Add("Hours", 3600);
  9.    dateParts.Add("Minutes", 60);
  10.    dateParts.Add("Seconds", 1);
  11.  
  12.    TimeSpan time = dateEnd - dateStart;
  13.    double totalSeconds = time.TotalSeconds;
  14.    List<string> result = new List<string>();
  15.    int diff;
  16.  
  17.    foreach (KeyValuePair<string, double> part in dateParts)
  18.    {
  19.        diff = (int)(totalSeconds / part.Value);
  20.        totalSeconds -= (diff * part.Value);
  21.  
  22.        result.Add(string.Format("{0} {1}", diff, part.Key));
  23.    }
  24.  
  25.    return string.Join(", ", result.ToArray());
  26. }

Creo que se podría implementar el método, pero ya no es tan "sencillo"

Saludos
« Última modificación: 15 Agosto 2013, 23:09 pm por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #8 en: 16 Agosto 2013, 02:13 am »

La ciencia de "1 mes" no es exacta, son todo promedios, Google dice que son 30 días como ha dicho Novlucker, pero la Wikipedia dice que son 29, y nosotros cuando decimos un mes (al menos yo) pensamos en 30 días sin tener el cuenta el més en el que estamos, pero cuando decimos "el próximos més" pensamos en el día 1 del siguiente més, en fín por todo esto creo que no hay que comerse mucho la cabeza para intentar calcular al milímetro los meses.

Así que aquí dejo el code funcional para VB que me ha proporcionado una persona, el code funciona con la fecha problemática que ha comentado @ostrede y también con los horarios:

Código
  1. #Region " Date Difference "
  2.  
  3.    ' Date Difference
  4.    '
  5.    ' Examples :
  6.    '
  7.    ' MsgBox(DateDifference(DateTime.Parse("01/03/2013"), DateTime.Parse("10/04/2013"))) ' Result: 1 Months, 1 Weeks, 2 Days, 0 Hours, 0 Minutes and 0 Seconds
  8.    ' MsgBox(DateDifference(DateTime.Parse("01/01/2013 14:00:00"), DateTime.Parse("02/01/2013 15:00:30"))) ' Result: 0 Months, 0 Weeks, 1 Days, 1 Hours, 0 Minutes and 30 Seconds
  9.  
  10.    Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
  11.  
  12.        Dim Time As TimeSpan
  13.        Dim MonthDiff As Integer, WeekDiff As Integer
  14.  
  15.        Do Until Date1 > Date2
  16.            Date1 = Date1.AddMonths(1)
  17.            MonthDiff += 1
  18.        Loop
  19.  
  20.        MonthDiff -= 1
  21.        Date1 = Date1.AddMonths(-1)
  22.        Time = (Date2 - Date1)
  23.        WeekDiff = (Time.Days \ 7)
  24.        Time = (Time - TimeSpan.FromDays(WeekDiff * 7))
  25.  
  26.        Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
  27.                             MonthDiff, WeekDiff, Time.Days, Time.Hours, Time.Minutes, Time.Seconds)
  28.  
  29.    End Function
  30.  
  31. #End Region

¿Tema solucionado? xD.

Saludos
En línea



ostrede

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿ Se puede hacer esta consulta de fechas ?
« Respuesta #9 en: 16 Agosto 2013, 07:50 am »

La ciencia de "1 mes" no es exacta, son todo promedios, Google dice que son 30 días como ha dicho Novlucker, pero la Wikipedia dice que son 29, y nosotros cuando decimos un mes (al menos yo) pensamos en 30 días sin tener el cuenta el més en el que estamos, pero cuando decimos "el próximos més" pensamos en el día 1 del siguiente més, en fín por todo esto creo que no hay que comerse mucho la cabeza para intentar calcular al milímetro los meses.

Así que aquí dejo el code funcional para VB que me ha proporcionado una persona, el code funciona con la fecha problemática que ha comentado @ostrede y también con los horarios:

Código
  1. Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
  2.  
  3.       Dim Time As TimeSpan
  4.       Dim MonthDiff As Integer, WeekDiff As Integer
  5.  
  6.       Do Until Date1 > Date2
  7.           Date1 = Date1.AddMonths(1)
  8.           MonthDiff += 1
  9.       Loop
  10.  
  11.       MonthDiff -= 1
  12.       Date1 = Date1.AddMonths(-1)
  13.       Time = (Date2 - Date1)
  14.       WeekDiff = (Time.Days \ 7)
  15.       Time = (Time - TimeSpan.FromDays(WeekDiff * 7))
  16.  
  17.       Return String.Format("{0} Months, {1} Weeks, {2} Days, {3} Hours, {4} Minutes and {5} Seconds", _
  18.                            MonthDiff, WeekDiff, Time.Days, Time.Hours, Time.Minutes, Time.Seconds)
  19.  
  20.   End Function

¿Tema solucionado? xD.

Saludos




¡¡ BUENÍSIMO !!
Ahora estoy trabajando con éste código para que me dé los meses, quincenas, semanas y días (con la salvedad que 1 mes lo cuente como 30 días, es así como lo quiero) pero creo que me estoy haciendo un lío.

Mi código es el siguiente( advierto que soy un novato en VBNET ):





Código
  1. Private Function DateDifference(ByVal Date1 As DateTime, ByVal Date2 As DateTime) As String
  2.  
  3.        Dim Time As TimeSpan
  4.        Dim MonthDiff As Integer, QuincenaDiff As Integer, weekdiff As Integer
  5.  
  6.        Do Until Date1 > Date2
  7.            Date1 = Date1.AddDays(30)
  8.            MonthDiff += 1
  9.  
  10.            Date1 = Date1.AddDays(15)
  11.            QuincenaDiff += 1
  12.  
  13.            Date1 = Date1.AddDays(7)
  14.            weekdiff += 1
  15.        Loop
  16.  
  17.        MonthDiff -= 1
  18.        Date1 = Date1.AddDays(-30)
  19.  
  20.        QuincenaDiff -= 1
  21.        Date1 = Date1.AddDays(-15)
  22.  
  23.        weekdiff -= 1
  24.        Date1 = Date1.AddDays(-7)
  25.  
  26.        Time = (Date2 - Date1)
  27.        QuincenaDiff  = (Time.Days \ 15)
  28.        Time = (Time - TimeSpan.FromDays(QuincenaDiff * 15))
  29.  
  30.        Time = (Date2 - Date1)
  31.        weekdiff = (Time.Days \ 7)
  32.        Time = (Time - TimeSpan.FromDays(weekdiff * 7))
  33.  
  34.  
  35.  
  36.        Return String.Format("{0} Months, {1} Quincenas, {2} weeks, {3} days, {4} Minutes and {5} Seconds", _
  37.                             MonthDiff, QuincenaDiff, weekdiff, Time.Days, Time.Hours, Time.Minutes, Time.Seconds)
  38.  
  39.    End Function



Pero cuando por ejemplo pongo desde el 16/08/2013 al 31/08/2013 me tira 1 quincena, 2 semanas y 1 día. Cuando debería decir 1 quincena.

¿Qué estoy haciendo mal?.



En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cómo hacer esta consulta SQL
Bases de Datos
Aikanáro Anário 1 4,518 Último mensaje 17 Septiembre 2011, 01:56 am
por fran800m
[MYSQL] Otra forma de hacer esta consulta?
Bases de Datos
klaine 1 3,453 Último mensaje 12 Noviembre 2011, 15:07 pm
por fran800m
Como hacer esta consulta??
Bases de Datos
[u]nsigned 5 10,667 Último mensaje 22 Diciembre 2011, 14:01 pm
por |Miguel|
¿Cómo hacer esta consulta? « 1 2 »
Bases de Datos
KateLibby 12 9,167 Último mensaje 14 Mayo 2012, 11:53 am
por KateLibby
Como hacer esta consulta mysql desde php?
Bases de Datos
dyhsoluciones 1 3,382 Último mensaje 14 Julio 2012, 04:02 am
por Yoghurt
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines