2010-02-03 12 views
49

Durante la conversione di .NET DateTime (quando è predefinito (DateTime)) su SqlDateTime devo sempre verificare se la data .NET è compresa tra SqlDateTime.MinValue e SqlDateTime.MaxValue [o] Esiste un buon modo per fare questo.Conversione da DateTime a SqlDateTime per .NET Date

+50

@JohnSaunders: Sì, questo è un pò schizzinosi. – Will

risposta

90

È possibile che la data potrebbe effettivamente essere al di fuori di tale intervallo? Viene dall'input dell'utente? Se la risposta a una di queste domande è sì, dovresti sempre controllare - altrimenti lascerai la tua applicazione incline all'errore.

È possibile formattare la data per l'inclusione in un'istruzione SQL piuttosto facilmente:

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

@ Winston: Sì, la mia data di arrivo può essere nulla prima o poi. – Sreedhar

+15

@Winston: * non * deve * formattare la data come stringa da includere in un'istruzione SQL. Utilizzare invece l'SQL parametrizzato con un parametro fortemente tipizzato. – LukeH

+5

Sono d'accordo con luke. Cosa succede se sei nato negli "utenti" del mese "tavolo", nell'anno "drop"? (Scherzi a parte, fai quello che dice Luca) –

2

Se si sta verificando per DBNULL, la conversione di un Datetime SQL per un DateTime .NET non dovrebbe essere un problema. Tuttavia, è possibile che si verifichino problemi durante la conversione di un DateTime .NET in un DateTime SQL valido.

SQL Server non riconosce le date precedenti a 1/1/1753. Questo è l'anno in cui l'Inghilterra adottò il calendario gregoriano. Solitamente il controllo di DateTime.MinValue è sufficiente, ma se si sospetta che i dati possano avere anni prima del 18 ° secolo, è necessario effettuare un altro controllo o utilizzare un tipo di dati diverso. (Mi chiedo spesso cosa utilizzano i musei nei loro database)

Il controllo della data massima non è realmente necessario, SQL Server e .NET DateTime hanno entrambi una data massima di 31/12/9999 Potrebbe essere una regola aziendale valida ma non causerà un problema.

1

sulla mia ricerca per fare questo con entitie, mi sono imbattuto qui, semplicemente premendo di nuovo a postare quello che ho scoperto ...

quando si utilizza EF4, colonna datetime "di uno SQL" può essere riempito da .NET's DateTime che utilizza BitConverter.

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

anche il collegamento di Fakrudeen mi ha portato ulteriormente ... grazie.

0

-Per confrontare solo la parte data, si può fare:

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