51 votes

Conversion DateTime de .NET à SqlDateTime

Lors de la conversion de .NET DateTime (quand est default(DateTime)) en SqlDateTime, dois-je toujours vérifier si la date .NET est comprise entre SqlDateTime.MinValue et SqlDateTime.MaxValue [ou] Y a-t-il une bonne façon de le faire ?

50 votes

@JohnSaunders : Oui, c'est un peu difficile.

94voto

Winston Smith Points 12029

Est-il possible que la date soit en fait en dehors de cette fourchette ? Cela provient-il de la saisie de l'utilisateur ? Si la réponse à l'une ou l'autre 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");

0 votes

@Winston : Oui, ma date d'arrivée peut être nulle à un moment donné.

16 votes

@Winston : Vous ne devrait pas formatez votre date sous forme de chaîne pour l'inclure dans une instruction SQL. Utilisez plutôt le SQL paramétré avec un paramètre fortement typé.

6 votes

Je suis d'accord avec luke. Et si vous étiez né le "users" du mois "table", dans l'année "drop" ? (Sérieusement tho, faites ce que Luke dit)

2voto

fremis Points 254

Si vous vérifiez l'absence de DBNULL, la conversion d'une date SQL en dateTime .NET ne devrait pas poser de problème. Cependant, vous pouvez rencontrer des problèmes lors de la conversion d'un DateTime .NET en un DateTime SQL valide.

Le serveur SQL 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. Habituellement, la vérification de DateTime.MinValue est suffisante, mais si vous soupçonnez que les données pourraient comporter des années antérieures au 18e siècle, vous devez effectuer une autre vérification ou utiliser un autre type de données. (Je me demande souvent ce que les musées utilisent dans leurs bases de données)

La vérification de 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.

1voto

Fakrudeen Points 1725

N'oubliez pas non plus que les résolutions [quantum de temps] sont différentes.

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

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

1voto

womd Points 645

Dans ma quête pour faire cela avec entitie, je suis tombé ici, je reviens juste pour poster ce que j'ai trouvé...

en utilisant EF4, la colonne datetime d'un sql peut être remplie à partir de DateTime de .NET en utilisant BitConverter.

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

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

0voto

christianb35 Points 36

-Pour comparer uniquement la partie date, vous pouvez le faire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X