128 votes

Format DateTime au format SQL en utilisant C#

J'essaie d'enregistrer le format de date et d'heure actuel à partir de C# et de le convertir en un format de date du serveur SQL, comme suit yyyy-MM-dd HH:mm:ss pour que je puisse l'utiliser pour mon UPDATE requête.

C'était mon premier code :

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

La sortie sur la date est correcte, mais l'heure est toujours "12:00:00". J'ai donc modifié mon code comme suit :

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

Il m'a donné cette erreur de compilation :

FormatException n'a pas été géré

Et j'ai suggéré de l'analyser. J'ai donc essayé de faire cela dans mon code selon mes recherches ici sur StackOverflow :

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

ou

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

Mais il me dit que c'est une méthode qui n'est pas valable pour le contexte donné. J'ai essayé de chercher des solutions à mon problème et je suis bloqué depuis deux heures maintenant. Je suis encore un peu novice en C#, pouvez-vous m'aider s'il vous plaît ?

267voto

Debajit Mukhopadhyay Points 3733

Essayez ceci ci-dessous

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

53voto

Dan Points 81

L'utilisation du format de date standard "s" assurera également la compatibilité avec l'internationalisation (MM/dd contre dd/MM) :

myDateTime.ToString("s");

=> 2013-12-31T00:00:00

Options complètes : (code : exemple de résultat)

d: 6/15/2008 
D: Sunday, June 15, 2008 
f: Sunday, June 15, 2008 9:15 PM 
F: Sunday, June 15, 2008 9:15:07 PM 
g: 6/15/2008 9:15 PM 
G: 6/15/2008 9:15:07 PM 
m: June 15 
o: 2008-06-15T21:15:07.0000000 
R: Sun, 15 Jun 2008 21:15:07 GMT 
s: 2008-06-15T21:15:07 
t: 9:15 PM 
T: 9:15:07 PM 
u: 2008-06-15 21:15:07Z 
U: Monday, June 16, 2008 4:15:07 AM 
y: June, 2008 

'h:mm:ss.ff t': 9:15:07.00 P 
'd MMM yyyy': 15 Jun 2008 
'HH:mm:ss.f': 21:15:07.0 
'dd MMM HH:mm:ss': 15 Jun 21:15:07 
'\Mon\t\h\: M': Month: 6 
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

Pris en charge par .NET Framework : 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Référence : DateTime.ToString Méthode

11voto

alzaimar Points 3290

La réponse correcte a déjà été donnée "utiliser les paramètres". Le fait de formater une date et de la transmettre comme chaîne de caractères à SQL-Server peut entraîner des erreurs, car l'interprétation de la date du côté du serveur dépend des paramètres. En Europe, nous écrivons '1.12.2012' pour indiquer le 1er décembre 2012, alors que dans d'autres pays, cela peut être considéré comme le 12 janvier.

Lorsque j'émets des déclarations directement dans SSMS, j'utilise le format suivant yyyymmdd qui semblent être assez générales. Je n'ai rencontré aucun problème sur les différentes installations sur lesquelles j'ai travaillé jusqu'à présent.

Il existe un autre format rarement utilisé, qui est un peu bizarre mais qui fonctionne pour toutes les versions :

select { d '2013-10-01' }

sera de retour le premier octobre 2013.

select { ts '2013-10-01 13:45:01' }

reviendra le 1er octobre, 13:45:01 PM

Je conseille vivement d'utiliser les paramètres et jamais formater votre propre code SQL en collant ensemble des fragments d'instructions formatées maison. C'est une entrée pour l'injection SQL et les erreurs étranges (le formatage d'une valeur flottante est un autre problème potentiel)

7voto

mkb Points 21

Utilisons la classe SqlDateTime intégrée.

new SqlDateTime(DateTime.Now).ToSqlString()

Mais il faut encore vérifier les valeurs nulles. Cela va provoquer une exception de débordement

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

5voto

Dmitry Bychenko Points 17719

Votre problème est dans la propriété "Date" qui tronque DateTime à ce jour seulement. Vous pourriez mettre la conversion comme ceci :

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

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