Formato DateTime in formato SQL utilizzando C #


111

Sto cercando di salvare il formato di data e ora corrente da C # e convertirlo in un formato di data di SQL Server in questo modo yyyy-MM-dd HH:mm:sscosì posso usarlo per la mia UPDATEquery.

Questo è stato il mio primo codice:

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

L'output della data va bene, ma l'ora è sempre "12:00:00", quindi ho cambiato il mio codice come segue:

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

Mi ha dato questo errore di compilazione:

FormatException non è stata gestita

E mi ha suggerito di analizzare. Quindi ho provato a farlo sul mio codice come da mia ricerca qui in StackOverflow:

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

o

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

Ma mi sta dicendo che è un metodo che non è valido per un dato contesto. Ho provato a cercare soluzioni al mio problema e sono rimasto bloccato per due ore. Sono ancora un po 'nuovo in C #, puoi aiutarmi per favore?


Hai esaminato DateTime.TryParseExact?
Tim


3
Perché non utilizzare un parametro per aggiornare DateTimeo lo stai memorizzando come stringa? Anche ToStringsu Dateimplicherebbe che il tempo è sempre12:00:00
V4Vendetta

3
Dovresti usare una query parametrizzata con un parametro di tipo DATETIMEe quindi potresti evitare di fare tutta questa conversione avanti e indietro da e verso una rappresentazione di stringa!
marc_s

5
Come altri hanno già detto, utilizzare i parametri e mantenere tutto come datetimesarebbe un buon inizio. Ancora meglio, perché stai passando l' ora corrente al server - ha una GETDATE()funzione che può essere chiamata interamente dal lato server.
Damien_The_Unbeliever

Risposte:


219

prova questo di seguito

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

grazie mille stavo provando stringa sqlFormattedDate = myDateTime.DateTime ... per qualche motivo questo è quello che voglio ottenere.
Ace Caserya

La mia ricerca in stackoverflow continua a rimandarmi a un riferimento sbagliato anche se alla domanda è stata data risposta più volte, i neofiti come me non possono relazionarsi per questo motivo. Scusate tutti, chiuderò la domanda non appena possibile.
Ace Caserya

1
Penso che il formato C # "Sortable" faccia la stessa cosa. Quindi puoi semplicemente fare myDateTime.ToString ("s");
ProVega

@ProVega non ha lo stesso aspetto (.ToString ('s') ha una T invece di uno spazio tra data e ora) - ma posso confermare che sono analizzati dallo stesso server SQL con o senza T ( Sono nel 2012). Ho iniziato a usare 's' come formato di data e ora di registrazione, quindi lo seguirò penso, grazie!
Ian Grainger

Sì, nella pagina ufficiale CAST e CONVERT (Transact-SQL) , usano il nome "ODBC canonical" per il modulo con uno spazio che separa yyyy-MM-dddall'ora del giorno e il nome "ISO8601" per il modulo in cui si trova il carattere di separazione a T. Ma sì, entrambe le forme si convertono implicitamente (e correttamente) in a datetime.
Jeppe Stig Nielsen

45

L'utilizzo del formato datetime standard "s" garantirà anche la compatibilità con l'internazionalizzazione (MM / dd contro dd / MM):

myDateTime.ToString("s");

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

Opzioni complete: (codice: risultato di esempio)

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

Supportato in .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Riferimento: DateTime.ToStringmetodo


1
Questo non è abbastanza dettagliato (manca i millisecondi) e ti metterà nei guai nelle query che si basano sull'ordinamento per data.
reijerh

Per ottenere anche ore e minuti, è possibile utilizzare questa conversione: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed il

9

La risposta corretta era già stata data "parametri di utilizzo". Formattare una data e passarla come stringa a SQL-Server può portare a errori in quanto dipende dalle impostazioni come la data viene interpretata sul lato server. In europa, scriviamo "1.12.2012" per indicare il 1 ° dicembre 2012, mentre in altri paesi potrebbe essere considerato il 12 gennaio.

Quando emetto dichiarazioni direttamente in SSMS, utilizzo il formato yyyymmddche sembra essere abbastanza generale. Non ho riscontrato alcun problema sulle varie installazioni su cui ho lavorato finora.

C'è un altro formato usato raramente, che è un po 'strano ma funziona per tutte le versioni:

select { d '2013-10-01' }

tornerà il primo ottobre 2013.

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

tornerà il 1 ° ottobre alle 13:45:01

Consiglio vivamente di utilizzare i parametri e di non formattare mai il proprio codice SQL incollando insieme frammenti di istruzioni formattate in proprio. È una voce per SQL injection e strani errori (la formattazione di un valore float è un altro potenziale problema)


3

Il tuo primo codice funzionerà in questo modo

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

3

Il tuo problema è nella proprietà "Data" che viene troncata DateTimesolo a data. Potresti mettere la conversione in questo modo:

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

2

La risposta che stavo cercando era:

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

Ho anche imparato che puoi farlo in questo modo:

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

dove myCountryDateFormat può essere modificato per soddisfare le modifiche in base alle esigenze.

Si prega di notare che il tag "Questa domanda potrebbe già avere una risposta qui:" non ha effettivamente risposto alla domanda perché come puoi vedere ha utilizzato un ".Date" invece di ometterlo. È abbastanza confuso per i nuovi programmatori di .NET


2

se si desidera memorizzare la data corrente nella tabella in modo da poter utilizzare

GETDATE ();

o passare questa funzione come parametro

per esempio. 'update tblname set curdate = GETDATE () dove colname = 123'


1

Perché non saltare del tutto la stringa:

SqlDateTime myDateTime = DateTime.Now;

1

Il tuo problema è nella Dateproprietà che viene troncata DateTimesolo fino ad oggi. Potresti mettere la conversione in questo modo:

DateTime myDateTime = DateTime.Now;

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

Grazie. Proprio quello che stavo cercando;) Sorpreso Microsoft non ha aggiunto un flag o un comando per farlo più brevemente.
Zeek2

0

Un'altra soluzione per passare DateTime da C # a SQL Server, indipendentemente dalle impostazioni della lingua di SQL Server

presumibilmente che le tue Impostazioni regionali mostrino la data come gg.MM.yyyy (standard tedesco "104")

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

passa la variabile datetime C # alla variabile di tipo Date di SQL Server, considerando il mapping secondo le regole "104". La data del server SQL diventa yyyy-MM-dd

Se le impostazioni internazionali visualizzano DateTime in modo diverso, utilizzare la corrispondenza appropriata dalla tabella CONVERT di SQL Server

vedere di più sulle regole: https://www.techonthenet.com/sql_server/functions/convert.php


0

Penso che il problema fossero le due virgolette singole mancanti.

Questo è lo sql che corro su MSSMS:

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

Come puoi vedere ci sono due virgolette singole, quindi i tuoi codici devono essere:

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

Usa virgolette singole per ogni stringa in MSSQL o anche in MySQL. Spero che aiuti.


0

Usiamo la classe SqlDateTime incorporata

new SqlDateTime(DateTime.Now).ToSqlString()

Ma è ancora necessario verificare la presenza di valori nulli. Questo genererà un'eccezione di overflow

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

Se vuoi aggiornare una tabella con quel dateTime, puoi usare la tua stringa sql come questo esempio:

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
Questa domanda è già stata risolta e accettata con una soluzione più elegante. E ti manca una chiusura ".
gennaio

-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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.