2010-02-03 33 views
49

Al convertir .NET DateTime (cuando es predeterminado (DateTime)) a SqlDateTime, siempre debo verificar si la fecha .NET está entre SqlDateTime.MinValue y SqlDateTime.MaxValue [o] ¿Hay una buena manera de hacerlo? para hacer esto..NET DateTime a SqlDateTime Conversión

+50

@JohnSaunders: Sí, es un poco exigente. – Will

Respuesta

90

¿Es posible que la fecha realmente esté fuera de ese rango? ¿Viene de la entrada del usuario? Si la respuesta a cualquiera de estas preguntas es sí, entonces siempre debe verificar; de lo contrario, está dejando su aplicación propensa al error.

Puede formatear la fecha para su inclusión en una sentencia SQL con bastante facilidad:

var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss"); 
+0

@ Winston: Sí, mi fecha de entrada puede ser nula en algún momento. – Sreedhar

+15

@ Winston: Usted * no debe * formatear su fecha como una cadena para su inclusión en una declaración de SQL. Use SQL parametrizado con un parámetro fuertemente tipado en su lugar. – LukeH

+5

Estoy de acuerdo con Lucas. ¿Qué sucede si nació en la "tabla" de "usuarios" del mes, en el año "drop"? (Hablando en serio, haz lo que dice Luke) –

2

Si usted está mirando para DBNULL, la conversión de una fecha y hora de SQL a un .NET DateTime no debería ser un problema. Sin embargo, puede encontrarse con problemas al convertir un .NET DateTime en un SQL DateTime válido.

SQL Server no reconoce las fechas anteriores al 1/1/1753. Ese es el año en que Inglaterra adoptó el Calendario Gregoriano. Por lo general, la comprobación de DateTime.MinValue es suficiente, pero si sospecha que los datos podrían tener años anteriores al siglo XVIII, debe realizar otra verificación o utilizar un tipo de datos diferente. (A menudo me pregunto qué usan los museos en sus bases de datos)

La comprobación de la fecha máxima no es realmente necesaria, SQL Server y .NET DateTime ambos tienen una fecha máxima de 31/12/9999 Puede ser una regla comercial válida pero no causará un problema

1

en mi búsqueda para hacer esto con entitie, tropecé por aquí, simplemente con apretar de nuevo a publicar lo que he descubierto ...

cuando se utiliza EF4, la columna de fecha y hora "de un SQL" puede ser llenado desde DateTime de .NET usando BitConverter.

EntitieObj.thetime = BitConverter.GetBytes(DateTime.Now.ToBinary()); 

también el enlace de Fakrudeen me trajo más ... gracias.

0

-Para comparar sólo la parte de fecha, puede hacerlo:

var result = db.query($"SELECT * FROM table WHERE date >= '{fromDate.ToString("yyyy-MM-dd")}' and date <= '{toDate.ToString("yyyy-MM-dd"}'"); 
Cuestiones relacionadas