2011-10-07 19 views
43

Parece que no puedo convertir un sqldatatime.minvalue a un objeto datetime.Cómo convertir sqldatetime.minvalue a datetime?

me trataron:

Datetime dt = Convert.ToDateTime(SqlDateTime.MinValue); 

Eso obviamente no funciona.

+0

Gracias por esto. Tu código me ayudó a leer un retorno de SQL 'DateTime dateValue = Convert.ToDateTime (reader.GetValue (8));' –

Respuesta

62

¿Alguna razón para no usar el explicit conversion operator?

DateTime dt = (DateTime) SqlDateTime.MinValue; 

que funciona para mí:

using System; 
using System.Data.SqlTypes; 

class Test 
{ 
    static void Main() 
    { 
     DateTime dt = (DateTime) SqlDateTime.MinValue; 
     Console.WriteLine(dt); 
    } 
} 
+0

¿por qué funcionaría eso y no Convert.ToDateTime() extraño? – codecompleting

+4

@codecompleting, 'Convert.ToDateTime' necesitaría una sobrecarga adecuada para soportar el valor' SqlDateTime'. Los diseñadores de 'Convert' no deben haberlo considerado [lo suficientemente importante], mientras que los diseñadores de' SqlDateTime' ciertamente sí lo consideraron. –

126

No hay necesidad de convertir. SqlDateTime tiene una propiedad Value que devuelve DateTime.

DateTime dt = SqlDateTime.MinValue.Value; 
+30

Una pregunta rara donde hay una mejor respuesta para Jon Skeets :-) – PeteT

+1

No lo vi venir. –

14

Las respuestas que ha recibido le han mostrado dos formas diferentes de convertir el valor. Una es usar una conversión explícita definida para SqlDateTime a DateTime, la otra es acceder a la propiedad .Value en la instancia SqlDateTime, que devuelve DateTime.

var date = theSqlDate.Value; // via property 
var date = (DateTime)theSqlDate; // via explicit conversion 

Hay compensaciones que vale la pena considerar. SqlDateTime admite el concepto de valores nulos en la base de datos (DBNull, referenciado por otra respuesta ahora eliminada) a través del valor SqlDateTime.Null. Si accede a la propiedad Value en una instancia "nula", se encontrará con un SqlNullValueException. Por otro lado, una conversión explícita a DateTime da como resultado {January 1, 1900 12:00:00 AM}. Ninguno de estos resultados puede ser deseado en su código. Sobrescribir una entrada nula válida en la base de datos con un valor predeterminado no nulo podría ser tan malo como obtener una excepción en el tiempo de ejecución.

Si tiene una columna anulable en la base de datos, y si se está trabajando con SqlDateTime, puede que tenga que probar de forma explícita y tratar SqlDateTime.Null diferente, y entonces puede ser que no importa qué método se toma para la conversión de otros valores.

DateTime? date; 
if (theSqlDate.Equals(SqlDateTime.Null)) 
    date = null 
else 
    date = theSqlDate.Value; // or (DateTime)theSqlDate; 
+5

Es una respuesta rara que es mejor que una respuesta mejor que la de Jon Skeet. –