Format DateTime au format SQL en utilisant C #


111

J'essaie d'enregistrer le format de date et d'heure actuel à partir de C # et de le convertir en un format de date SQL Server afin yyyy-MM-dd HH:mm:ssque je puisse l'utiliser pour ma UPDATErequête.

C'était mon premier code:

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

La sortie à la date est correcte, mais l'heure est toujours "12:00:00" donc j'ai changé mon code comme suit:

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

Cela m'a donné cette erreur de compilation:

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

Et j'ai suggéré que je devais analyser. J'ai donc essayé de faire cela à mon code selon mes recherches ici dans 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 cela me dit que c'est une méthode qui n'est pas valable pour un 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 nouveau en C #, pouvez-vous m'aider s'il vous plaît?


Avez-vous regardé DateTime.TryParseExact?
Tim


3
Pourquoi ne pas utiliser un paramètre pour mettre à jour le DateTimeou le stockez-vous sous forme de chaîne? Aussi ToStringsur Dateimpliquerait que le temps est toujours12:00:00
V4Vendetta

3
Vous devriez utiliser une requête paramétrée avec un paramètre de type DATETIMEet vous pourriez alors éviter de faire tout cela en effectuant des va-et-vient vers et depuis une représentation sous forme de chaîne!
marc_s

5
Comme d'autres l'ont dit, utiliser des paramètres et garder tout comme un datetimeserait un bon début. Mieux encore, pourquoi passez-vous au serveur l' heure actuelle - il a une GETDATE()fonction qui peut être appelée entièrement du côté du serveur.
Damien_The_Unbeliever

Réponses:


219

essayez ceci ci-dessous

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

merci beaucoup, j'essayais la chaîne sqlFormattedDate = myDateTime.DateTime ... pour une raison quelconque, c'est ce que je veux réaliser.
Ace Caserya

Ma recherche dans stackoverflow continue de me référer à une fausse référence bien que la question ait été répondue plusieurs fois, les débutants comme moi ne peuvent pas comprendre à cause de cela. Désolé pour tous, je clore la question dès que possible.
Ace Caserya

1
Je pense que le format C # "triable" fait la même chose. Vous pouvez donc simplement faire myDateTime.ToString ("s");
ProVega

@ProVega cela n'a pas la même apparence (.ToString ('s') a un T au lieu d'un espace entre la date et l'heure) - mais je peux confirmer qu'ils sont analysés de la même manière par le serveur SQL avec ou sans le T ( Je suis en 2012). J'ai commencé à utiliser 's' comme format de datetime de journalisation, donc je vais y aller je pense, merci!
Ian Grainger

Ouais, sur la page officielle CAST et CONVERT (Transact-SQL) , ils utilisent le nom "ODBC canonical" pour le formulaire avec un espace séparant yyyy-MM-ddl'heure du jour, et le nom "ISO8601" pour le formulaire où se trouve le caractère de séparation a T. Mais oui, les deux formes se convertissent implicitement (et correctement) en un datetime.
Jeppe Stig Nielsen

45

L'utilisation du format standard datetime "s" garantira également la compatibilité d'internationalisation (MM / jj contre jj / 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 dans .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Référence: DateTime.ToStringMéthode


1
Ce n'est pas assez précis (manque les millisecondes) et vous causera des problèmes dans les requêtes qui reposent sur un classement par date.
reijerh

Pour obtenir également les heures et les minutes, vous pouvez utiliser cette conversion: string sqlFormattedDate = YourDate.ToString ("aaaa-MM-jjTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed le

9

La bonne réponse a déjà été donnée "utiliser les paramètres". Le formatage d'une date et sa transmission sous forme de chaîne à SQL-Server peuvent entraîner des erreurs car cela dépend des paramètres d'interprétation de la date côté serveur. En Europe, nous écrivons «1.12.2012» pour indiquer le 1er décembre 2012, alors que dans d'autres pays, cela peut être traité comme le 12 janvier.

Lorsque j'émets des déclarations directement dans SSMS, j'utilise le format yyyymmddqui semble assez général. 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' }

sera de retour le 1er octobre à 13:45:01

Je conseille vivement d'utiliser des paramètres et de ne jamais formater votre propre code SQL en collant ensemble des fragments d'instructions formatés 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)


3

Votre premier code fonctionnera en faisant cela

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

3

Votre problème est dans la propriété "Date" qui tronque DateTimeà date uniquement. Vous pouvez mettre la conversion comme ceci:

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

2

La réponse que je recherchais était:

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

J'ai également appris que vous pouvez le faire de cette façon:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

où myCountryDateFormat peut être modifié pour répondre au changement en fonction des besoins.

Veuillez noter que le tag "Cette question peut déjà avoir une réponse ici:" n'a pas réellement répondu à la question car comme vous pouvez le voir, il a utilisé un ".Date" au lieu de l'omettre. C'est assez déroutant pour les nouveaux programmeurs de .NET


2

si vous souhaitez stocker la date actuelle dans le tableau afin que vous puissiez utiliser

AVOIR UN RENDEZ-VOUS();

ou passez cette fonction en paramètre

par exemple. 'update tblname set curdate = GETDATE () où colname = 123'


1

Pourquoi ne pas ignorer complètement la chaîne:

SqlDateTime myDateTime = DateTime.Now;

1

Votre problème est dans la Datepropriété qui tronque DateTimeà date uniquement. Vous pouvez mettre la conversion comme ceci:

DateTime myDateTime = DateTime.Now;

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

Merci. Juste ce que je cherchais;) Surpris, Microsoft n'a pas ajouté un drapeau ou une commande pour le faire plus brièvement.
Zeek2

1

Utilisons la classe SqlDateTime intégrée

new SqlDateTime(DateTime.Now).ToSqlString()

Mais encore besoin de vérifier les valeurs nulles. Cela lèvera 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.


0

Une autre solution pour passer DateTime de C # à SQL Server, quels que soient les paramètres de langue de SQL Server

supposé que vos paramètres régionaux affichent la date au format jj.MM.aaaa (norme allemande `` 104 '') puis

DateTime myDateTime = DateTime.Now;
string sqlServerDate ="CONVERT("date,'"+myDateTime+"',104)"; 

transmet la variable datetime C # à la variable de type Date de SQL Server, en tenant compte du mappage selon les règles «104». La date du serveur SQL devient aaaa-MM-jj

Si vos paramètres régionaux affichent la date et l'heure différemment, utilisez la correspondance appropriée de la table de conversion SQL Server

en savoir plus sur les règles: https://www.techonthenet.com/sql_server/functions/convert.php


0

Je pense que le problème était l'absence de deux guillemets simples.

Voici le sql que je lance sur le MSSMS:

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

Comme vous pouvez le voir, il y a deux guillemets simples, vos codes doivent donc être:

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

Utilisez des guillemets simples pour chaque chaîne dans MSSQL ou même dans MySQL. J'espère que ça aide.



-1

Si vous souhaitez mettre à jour une table avec cette dateTime, vous pouvez utiliser votre chaîne SQL comme cet exemple:

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}, myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

2
Cette question a déjà été répondue et acceptée avec une solution plus élégante. Et vous manquez une fermeture ".
janvier

-1
   DateTime date1 = new DateTime();

    date1 = Convert.ToDateTime(TextBox1.Text);
    Label1.Text = (date1.ToLongTimeString()); //11:00 AM
    Label2.Text = date1.ToLongDateString(); //Friday, November 1, 2019;
    Label3.Text = date1.ToString();
    Label4.Text = date1.ToShortDateString();
    Label5.Text = date1.ToShortTimeString();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.