DateTime-Format in SQL-Format mit C #


110

Ich versuche, das aktuelle Datums- / Uhrzeitformat aus C # zu speichern und es in ein SQL Server-Datumsformat wie dieses zu konvertieren, yyyy-MM-dd HH:mm:ssdamit ich es für meine UPDATEAbfrage verwenden kann.

Dies war mein erster Code:

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

Die Ausgabe am Datum ist in Ordnung, aber die Uhrzeit ist immer "12:00:00", daher habe ich meinen Code wie folgt geändert:

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

Es gab mir diesen Kompilierungsfehler:

FormatException wurde nicht behandelt

Und schlug vor, ich muss analysieren. Also habe ich versucht, dies mit meinem Code gemäß meiner Recherche hier in StackOverflow zu tun:

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

oder

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

Aber es sagt mir, dass es eine Methode ist, die für einen bestimmten Kontext nicht gültig ist. Ich habe versucht, nach Lösungen für mein Problem zu suchen, und bin jetzt seit zwei Stunden festgefahren. Ich bin noch ein bisschen neu in C #. Kannst du mir bitte helfen?


Haben Sie sich DateTime.TryParseExact angesehen?
Tim


3
Warum nicht einen Parameter verwenden, um den zu aktualisieren, DateTimeoder speichern Sie ihn als Zeichenfolge? Auch ToStringauf Datewürde bedeuten, dass die Zeit immer ist12:00:00
V4Vendetta

3
Sie sollten eine parametrisierte Abfrage mit einem Parameter vom Typ verwenden, DATETIMEund dann könnten Sie vermeiden, all diese Konvertierungen hin und her zu und von einer Zeichenfolgendarstellung durchzuführen!
marc_s

5
Wie andere gesagt haben, datetimewäre es ein guter Anfang , Parameter zu verwenden und einfach alles als zu behalten . Noch besser, warum übergeben Sie den Server zur aktuellen Zeit - er hat eine GETDATE()Funktion, die vollständig auf der Serverseite aufgerufen werden kann.
Damien_The_Unbeliever

Antworten:


218

Versuchen Sie dies unten

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

Vielen Dank, ich habe versucht, string sqlFormattedDate = myDateTime.DateTime ... aus irgendeinem Grund ist dies das, was ich erreichen möchte.
Ace Caserya

Meine Suche in stackoverflow verweist mich immer wieder auf eine falsche Referenz, obwohl die Frage mehrmals beantwortet wurde. Neulinge wie ich können sich aus diesem Grund nicht darauf beziehen. Entschuldigung an alle, ich werde die Frage schließen, sobald ich dazu in der Lage bin.
Ace Caserya

1
Ich denke, das C # "Sortierbare" Format macht das Gleiche. Sie können also einfach myDateTime.ToString ("s") ausführen.
ProVega

@ProVega sieht nicht gleich aus (.ToString ('s') hat ein T anstelle eines Leerzeichens zwischen Datum und Uhrzeit) - aber ich kann bestätigen, dass sie vom SQL Server mit oder ohne T gleich analysiert werden ( Ich bin auf 2012). Ich habe angefangen, 's' als mein Protokollierungsdatum / -zeitformat zu verwenden, also werde ich damit weitermachen, denke ich, danke!
Ian Grainger

Ja, auf der offiziellen Seite CAST und CONVERT (Transact-SQL) verwenden sie den Namen "ODBC canonical" für das Formular mit einem yyyy-MM-ddvon der Tageszeit getrennten Leerzeichen und den Namen "ISO8601" für das Formular, in dem sich das Trennzeichen befindet a T. Aber ja, beide Formen konvertieren implizit (und korrekt) in a datetime.
Jeppe Stig Nielsen

44

Die Verwendung des Standard-Datums- / Uhrzeitformats "s" gewährleistet auch die Internationalisierungskompatibilität (MM / dd gegenüber dd / MM):

myDateTime.ToString("s");

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

Vollständige Optionen: (Code: Beispielergebnis)

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

Unterstützt in .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Referenz: DateTime.ToStringMethode


1
Dies ist nicht feinkörnig genug (verpasst die Millisekunden) und führt zu Problemen bei Abfragen, bei denen die Bestellung nach Datum erfolgt.
reijerh

Um auch Stunden und Minuten abzurufen
Netfed

9

Die richtige Antwort wurde bereits "Parameter verwenden" gegeben. Das Formatieren eines Datums und das Übergeben als Zeichenfolge an SQL-Server kann zu Fehlern führen, da dies von den Einstellungen abhängt, wie das Datum auf der Serverseite interpretiert wird. In Europa schreiben wir '1.12.2012', um den 1. Dezember 2012 anzuzeigen, während dies in anderen Ländern als 12. Januar behandelt werden könnte.

Wenn ich Anweisungen direkt in SSMS gebe, verwende ich das Format, yyyymmdddas ziemlich allgemein zu sein scheint. Bei den verschiedenen Installationen, an denen ich bisher gearbeitet habe, sind keine Probleme aufgetreten.

Es gibt ein anderes selten verwendetes Format, das etwas seltsam ist, aber für alle Versionen funktioniert:

select { d '2013-10-01' }

wird am ersten Oktober 2013 zurückkehren.

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

wird am 1. Oktober um 13:45:01 Uhr zurückkehren

Ich empfehle dringend, Parameter zu verwenden und niemals Ihren eigenen SQL-Code zu formatieren, indem Sie selbst entwickelte formatierte Anweisungsfragmente zusammenfügen. Es ist ein Eintrag für SQL-Injection und seltsame Fehler (das Formatieren eines Float-Werts ist ein weiteres potenzielles Problem).


3

Ihr erster Code funktioniert auf diese Weise

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

3

Ihr Problem liegt in der Eigenschaft "Datum", DateTimedie nur auf das Datum gekürzt wird. Sie könnten die Konvertierung folgendermaßen setzen:

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

2

Die Antwort, die ich suchte, war:

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

Ich habe auch gelernt, dass Sie es so machen können:

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

Dabei kann myCountryDateFormat je nach Anforderung geändert werden, um Änderungen zu berücksichtigen.

Bitte beachten Sie, dass der Tag "Diese Frage hat hier möglicherweise bereits eine Antwort:" die Frage nicht beantwortet hat, da, wie Sie sehen, ein ".Date" verwendet wurde, anstatt es wegzulassen. Es ist ziemlich verwirrend für neue Programmierer von .NET


2

Wenn Sie das aktuelle Datum in einer Tabelle speichern möchten, damit Sie es verwenden können

VERABREDUNG BEKOMMEN();

oder übergeben Sie diese Funktion als Parameter

z.B. 'update tblname set curdate = GETDATE () wobei colname = 123'


1

Warum nicht den String ganz überspringen:

SqlDateTime myDateTime = DateTime.Now;

1

Ihr Problem liegt in der DateEigenschaft, DateTimedie bisher nur abgeschnitten wurde . Sie könnten die Konvertierung folgendermaßen setzen:

DateTime myDateTime = DateTime.Now;

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

Vielen Dank. Genau das, wonach ich gesucht habe;) Überrascht hat Microsoft kein Flag oder keinen Befehl hinzugefügt, um dies kurz zu machen.
Zeek2

0

Eine weitere Lösung zum Übergeben von DateTime von C # an SQL Server, unabhängig von den Spracheinstellungen von SQL Server

angeblich, dass Ihre regionalen Einstellungen dann das Datum als dd.MM.yyyy (deutscher Standard '104') anzeigen

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

Übergibt die Variable C # datetime an die Variable vom Typ SQL Server Date, wobei die Zuordnung gemäß den "104" -Regeln berücksichtigt wird. SQL Server Datum erhält JJJJ-MM-TT

Wenn in Ihren regionalen Einstellungen DateTime anders angezeigt wird, verwenden Sie die entsprechende Übereinstimmung aus der SQL Server CONVERT-Tabelle

Weitere Informationen zu Regeln finden Sie unter https://www.techonthenet.com/sql_server/functions/convert.php


0

Ich denke, das Problem war, dass zwei einfache Anführungszeichen fehlten.

Dies ist die SQL, die ich für das MSSMS ausführe:

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

Wie Sie sehen können, gibt es zwei einfache Anführungszeichen, daher müssen Ihre Codes lauten:

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

Verwenden Sie in MSSQL oder sogar in MySQL einfache Anführungszeichen für jede Zeichenfolge. Ich hoffe das hilft.


0

Verwenden wir die integrierte SqlDateTime-Klasse

new SqlDateTime(DateTime.Now).ToSqlString()

Müssen aber noch auf Nullwerte prüfen. Dies löst eine Überlaufausnahme aus

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.



-1

Wenn Sie eine Tabelle mit dieser dateTime aktualisieren möchten, können Sie Ihre SQL-Zeichenfolge wie folgt verwenden:

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
Diese Frage wurde bereits mit einer eleganteren Lösung beantwortet und akzeptiert. Und Sie verpassen einen Abschluss ".
Jan

-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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.