locked
Restar dos variables que contienen fechas RRS feed

  • Pregunta

  • Quisiera saber como restar dos variables que tienen almacenadas dos fechas

    If readerultimafecha2.Read = True Then

                    fechadespacho = Convert.ToString(readerultimafecha2("FechaDespacho").ToString)

                    fechaingresoultima = Convert.ToString(readerultimafecha2("Ingreso").ToString)

                End If

    fechadespacho =  30/10/2011 10:12:04
    fechaingresoultima = 14/10/2011 10:12:04
    Saludos y gracias

    lunes, 17 de octubre de 2011 14:12

Respuestas

  • "Emanuel Jimenez" escribió:

    > Funciono perfecto.

    ¿Estás seguro? :-)

    Te funcionará perfecto siempre y cuando los campos 'FechaDespacho' e 'Ingreso' del supuesto objeto DataReader llamado 'readerultimafecha2' no contengan un valor NULL (que es un valor distinto a Nothing), y su valor se pueda convertir a DateTime.

    Pero si los valores son NULL, me parece a mí que no vas a poder convertir el valor a DateTime. ;-)

       Dim fechadespacho As DateTime = _
             Convert.ToDateTime(Convert.ToString(DBNull.Value))

    En este caso se obtendrá una excepción del tipo FormatException porque la cadena no se puede reconocer como un valor DateTime válido. Da igual que utilices la función CStr como el método ToString de la clase Convert.

    Tienes que detectar primero los posibles valores NULL y actuar en consecuencia:

       Dim value As Object = readerultimafecha2("FechaDespacho")

       Dim fechaDespacho As DateTime

       If (value IsNot DBNull.Value) Then
           fechaDespacho = Convert.ToDateTime(value)
       End If

    Y lo mismo tendrás que hacer con la variable 'fechaingresoultima'. Cuando tengas los dos valores DateTime válidos, es cuando tienes que efectuar la resta:

       Dim diferencia As TimeSpan = fechaingresoultima.Substract(fechaDespacho)
     
    Pero ésto sirve únicamente para evitar los posibles valores NULL existentes, no así para aquellos valores NO NULL que no se puedan convertir a DateTime. Pero ésto ya es obligación tuya de que a la hora de insertar los valores en la base de datos, tengan un valor DateTime válido.

    Adapta los ejemplos a tu código.

    Un saludo


    NOTA: si esta respuesta te ha resultado útil, no olvides marcarla como satisfactoria.

    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 17 de octubre de 2011 15:25
    Moderador
  • hola

    pero no deberias convertirlas en DateTime para poder operar con fechas ?

    o sea

    If readerultimafecha2.Read = True Then
    
    	Dim fechadespacho As DateTime = Convert.ToDateTime(CStr(readerultimafecha2("FechaDespacho")))
    	Dim fechaingresoultima As DateTime = Convert.ToDateTime(CStr(readerultimafecha2("Ingreso")))
    	
    	Dim resta As TimeSpan = fechaingresoultima.Substract(fechadespacho)
    	
    	txtDias.Text = resta.Days
    
    End If
    


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 17 de octubre de 2011 14:16
  • Funciono perfecto, muchas gracias 

     

    Saludos

    • Marcado como respuesta Emanuel Jimenez lunes, 17 de octubre de 2011 17:23
    lunes, 17 de octubre de 2011 15:06

Todas las respuestas

  • hola

    pero no deberias convertirlas en DateTime para poder operar con fechas ?

    o sea

    If readerultimafecha2.Read = True Then
    
    	Dim fechadespacho As DateTime = Convert.ToDateTime(CStr(readerultimafecha2("FechaDespacho")))
    	Dim fechaingresoultima As DateTime = Convert.ToDateTime(CStr(readerultimafecha2("Ingreso")))
    	
    	Dim resta As TimeSpan = fechaingresoultima.Substract(fechadespacho)
    	
    	txtDias.Text = resta.Days
    
    End If
    


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 17 de octubre de 2011 14:16
  • Funciono perfecto, muchas gracias 

     

    Saludos

    • Marcado como respuesta Emanuel Jimenez lunes, 17 de octubre de 2011 17:23
    lunes, 17 de octubre de 2011 15:06
  • "Emanuel Jimenez" escribió:

    > Funciono perfecto.

    ¿Estás seguro? :-)

    Te funcionará perfecto siempre y cuando los campos 'FechaDespacho' e 'Ingreso' del supuesto objeto DataReader llamado 'readerultimafecha2' no contengan un valor NULL (que es un valor distinto a Nothing), y su valor se pueda convertir a DateTime.

    Pero si los valores son NULL, me parece a mí que no vas a poder convertir el valor a DateTime. ;-)

       Dim fechadespacho As DateTime = _
             Convert.ToDateTime(Convert.ToString(DBNull.Value))

    En este caso se obtendrá una excepción del tipo FormatException porque la cadena no se puede reconocer como un valor DateTime válido. Da igual que utilices la función CStr como el método ToString de la clase Convert.

    Tienes que detectar primero los posibles valores NULL y actuar en consecuencia:

       Dim value As Object = readerultimafecha2("FechaDespacho")

       Dim fechaDespacho As DateTime

       If (value IsNot DBNull.Value) Then
           fechaDespacho = Convert.ToDateTime(value)
       End If

    Y lo mismo tendrás que hacer con la variable 'fechaingresoultima'. Cuando tengas los dos valores DateTime válidos, es cuando tienes que efectuar la resta:

       Dim diferencia As TimeSpan = fechaingresoultima.Substract(fechaDespacho)
     
    Pero ésto sirve únicamente para evitar los posibles valores NULL existentes, no así para aquellos valores NO NULL que no se puedan convertir a DateTime. Pero ésto ya es obligación tuya de que a la hora de insertar los valores en la base de datos, tengan un valor DateTime válido.

    Adapta los ejemplos a tu código.

    Un saludo


    NOTA: si esta respuesta te ha resultado útil, no olvides marcarla como satisfactoria.

    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 17 de octubre de 2011 15:25
    Moderador
  • Muchas gracias, es importante tener en cuenta los valores NULL. Voy a agregarle esto

     

    Saludos

    lunes, 17 de octubre de 2011 17:26