web-dev-qa-db-fra.com

Conversion de .NET DateTime en SqlDateTime

Lors de la conversion de .NET DateTime (quand est default (DateTime)) en SqlDateTime, dois-je toujours vérifier si la date .NET se situe entre SqlDateTime.MinValue et SqlDateTime.MaxValue [ou] Y a-t-il un bon moyen de le faire.

50
Sreedhar

Est-il possible que la date soit en dehors de cette plage? Cela vient-il de la saisie de l'utilisateur? Si la réponse à l'une de ces questions est oui, vous devez toujours vérifier, sinon vous laissez votre application sujette aux erreurs.

Vous pouvez formater votre date pour l'inclure dans une instruction SQL assez facilement:

var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");
93
Winston Smith

Si vous recherchez DBNULL, la conversion d'une date/heure SQL en une date/heure .NET ne devrait pas poser de problème. Toutefois, vous pouvez rencontrer des problèmes pour convertir un .NET DateTime en un DateTime SQL valide. 

SQL Server ne reconnaît pas les dates antérieures au 1/1/1753. C'est l'année où l'Angleterre a adopté le calendrier grégorien. Généralement, il suffit de vérifier DateTime.MinValue, mais si vous pensez que les données peuvent avoir des années avant le 18ème siècle, vous devez effectuer une nouvelle vérification ou utiliser un type de données différent. (Je me demande souvent ce que les musées utilisent dans leurs bases de données)

Vérifier la date maximale n'est pas vraiment nécessaire. SQL Server et .NET DateTime ont tous deux une date maximale de 31/12/9999. Il peut s'agir d'une règle de gestion valide, mais cela ne posera pas de problème.

2
fremis

dans ma quête de faire cela avec le droit, je suis tombé par hasard ici, en revenant pour poster ce que j'ai découvert ...

lors de l'utilisation de EF4, la colonne datetime "d'un SQL" peut être remplie à partir de DateTime .NET à l'aide de BitConverter 

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

le lien de Fakrudeen m'a également amené plus loin ... merci.

1
womd

Souvenez-vous également que les résolutions [quantum de temps] sont différentes.

http://msdn.Microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.aspx

SQL one est de 3,33 ms et .net est de 100 ns.

1
Fakrudeen

-Pour ne comparer que la partie date, vous pouvez faire:

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