read parsear convert c# sql-server datetime

parsear - read datetime c#



DateTime.MinValue y SqlDateTime overflow (9)

No quiero validar txtBirthDate así que quiero pasar DateTime.MinValue en la base de datos.

Mi código:

if (txtBirthDate.Text == string.Empty) objinfo.BirthDate = DateTime.MinValue; else objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);

DateTime.MinValue return Date = {1/1/0001 12:00:00 AM}

Tengo un error de SQL:

SqlDateTime desbordamiento. Debe estar entre el 1/1/1753 12:00:00 AM y el 12/31/9999 11:59:59 PM.

Lo entiendo pero no entiendo por qué DateTime.MinValue devuelve una fecha no válida que no se puede insertar en la base de datos. ¿Cómo manejar este tipo de situación?


Esto es lo que puedes hacer. Aunque hay muchas maneras de lograrlo.

DateTime? d = null; if (txtBirthDate.Text == string.Empty) objinfo.BirthDate = d; else objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);

Nota: Esto funcionará solo si la columna de fecha y hora de su base de datos es Permitir nulo. De lo contrario, puede definir un valor mínimo estándar para DateTime d.


Aunque es una pregunta antigua, otra solución es usar datetime2 para la columna de la base de datos. Enlace MSDN


Básicamente, no use DateTime.MinValue para representar un valor faltante. No puede usar DateTime.MinValue en un campo de DateTime de SQL Server, ya que SQL Server tiene un valor mínimo de inicio de 1753.

En su lugar, convierta su propiedad BirthDate en Nullable<DateTime> (también conocida como DateTime? ), Y Nullable<DateTime> en null cuando no tenga un valor. También asegúrese de que el campo de su base de datos sea anulable. Luego, solo debe asegurarse de que ese null termine como un valor NULL en la base de datos. Exactamente cómo lo hará dependerá de su acceso a los datos, del cual no nos ha dicho nada.


Bueno ... es bastante simple obtener una fecha mínima de SQL

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue


Desde MSDN:

Datos de fecha y hora desde el 1 de enero de 1753 hasta el 31 de diciembre de 9999, con una precisión de un centésimo de segundo o 3,33 milisegundos. Los valores se redondean a incrementos de .000, .003 o .007 milisegundos. Se almacena como dos enteros de 4 bytes. Los primeros 4 bytes almacenan el número de días antes o después de la fecha base, 1 de enero de 1900. La fecha base es la fecha de referencia del sistema. Los valores de fecha y hora anteriores al 1 de enero de 1753 no están permitidos. Los otros 4 bytes almacenan la hora del día representada como el número de milisegundos después de la medianoche. Los segundos tienen un rango válido de 0–59.

SQL usa un sistema diferente de C # para los valores de DateTime.

Puede usar MinValue como valor de centinela, y si es MinValue, pase el valor nulo a su objeto (y almacene la fecha como anulable en la base de datos).

if(date == dateTime.Minvalue) objinfo.BirthDate = null;


En pocas palabras, no utilice DateTime.MinVaue como valor predeterminado.

Hay un par de MinValues diferentes por ahí, dependiendo del entorno en el que se encuentre.

Una vez tuve un proyecto, donde estaba implementando un proyecto de Windows CE, estaba usando DateTime.MinValue (año 0001) del MinValue , la base de datos MinValue (1753) y un DateTimePicker control de UI (creo que era 1970). Así que hubo al menos 3 valores de MinValues ​​diferentes que conducían a un comportamiento extraño y resultados inesperados. (Y creo que incluso hubo una cuarta versión (!), Simplemente no recuerdo de dónde vino).

Use un campo de base de datos anulable y cambie su valor en un Nullable<DateTime> lugar. Donde no haya un valor válido en su código, tampoco debería haber un valor en la base de datos. :-)


Estoy usando esta función para tryparse

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate) { bool valid = false; tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; System.Data.SqlTypes.SqlDateTime sdt; if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate)) { try { sdt = new System.Data.SqlTypes.SqlDateTime(tryDate); valid = true; } catch (System.Data.SqlTypes.SqlTypeException ex) { } } return valid; }


Muy simple, evite usar DateTime.MinValue use System.Data.SqlTypes.SqlDateTime.MinValue lugar.


usar extensiones

public static class DateTimeExtensions { public static DateTime MinValue(this DateTime sqlDateTime) { return new DateTime(1900, 01, 01, 00, 00, 00); } } DateTime date = DateTime.Now; Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());