Formato de fecha y hora a formato SQL usando C #

111

Estoy tratando de guardar el formato de fecha y hora actual de C # y convertirlo a un formato de fecha de SQL Server yyyy-MM-dd HH:mm:sspara poder usarlo para mi UPDATEconsulta.

Este fue mi primer código:

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

La salida en la fecha está bien, pero la hora siempre es "12:00:00", así que cambié mi código a lo siguiente:

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

Me dio este error de compilación:

FormatException no se controló

Y sugirió que necesito analizar. Así que intenté hacer esto en mi código según mi investigación aquí en 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");

Pero me está diciendo que es un método que no es válido para un contexto dado. Intenté buscar soluciones a mi problema y ya llevo dos horas estancado. Todavía soy un poco nuevo en C #, ¿pueden ayudarme por favor?

Ace Caserya
fuente
¿Ha mirado DateTime.TryParseExact?
Tim
3
¿Por qué no usar un parámetro para actualizar el DateTimeo lo está almacenando como una cadena? También ToStringen Dateimplicaría que el tiempo es siempre12:00:00
V4Vendetta
3
Debe usar una consulta parametrizada con un parámetro de tipo DATETIMEy luego podría evitar hacer toda esta conversión hacia y desde una representación de cadena.
marc_s
5
Como han dicho otros, usar parámetros y simplemente mantener todo como datetimesi fuera un buen comienzo. Aún mejor, ¿por qué le pasa al servidor la hora actual ? Tiene una GETDATE()función que se puede llamar por completo en el lado del servidor.
Damien_The_Unbeliever

Respuestas:

219

prueba esto a continuación

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
Debajit Mukhopadhyay
fuente
muchas gracias, estaba probando la cadena sqlFormattedDate = myDateTime.DateTime ... por alguna razón, esto es lo que quiero lograr.
Ace Caserya
Mi búsqueda en stackoverflow sigue refiriéndome a una referencia incorrecta, aunque la pregunta ha sido respondida varias veces, los novatos como yo no podemos relacionarnos debido a esto. Lo siento a todos, cerraré la pregunta tan pronto como pueda.
Ace Caserya
1
Creo que el formato "Clasificable" de C # hace lo mismo. Entonces puede simplemente hacer myDateTime.ToString ("s");
ProVega
@ProVega no se ve igual (.ToString ('s') tiene una T en lugar de un espacio entre la fecha y la hora), pero puedo confirmar que el servidor SQL los analiza de la misma manera con o sin la T ( Estoy en 2012). Comencé a usar 's' como mi formato de fecha y hora de registro, así que iré con eso, creo, ¡gracias!
Ian Grainger
Sí, en la página oficial CAST y CONVERT (Transact-SQL) , usan el nombre "ODBC canonical" para el formulario con un espacio que se separa yyyy-MM-ddde la hora del día y el nombre "ISO8601" para el formulario donde está el carácter separador a T. Pero sí, ambas formas se convierten implícitamente (y correctamente) a datetime.
Jeppe Stig Nielsen
44

El uso del formato estándar de fecha y hora "s" también garantizará la compatibilidad de internacionalización (MM / dd versus dd / MM):

myDateTime.ToString("s");

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

Opciones completas: (código: resultado de muestra)

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

Compatible con .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Referencia: DateTime.ToStringMétodo

Inactivo
fuente
1
Esto no es lo suficientemente detallado (pasa por alto los milisegundos) y le ocasionará problemas en las consultas que se basan en ordenar por fecha.
reijerh
Para obtener horas y minutos también, puede utilizar esta conversión: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed
9

La respuesta correcta ya fue dada "parámetros de uso". Dar formato a una fecha y pasarla como una cadena a SQL-Server puede dar lugar a errores, ya que depende de la configuración de cómo se interpreta la fecha en el lado del servidor. En Europa, escribimos '1.12.2012' para indicar el 1 de diciembre de 2012, mientras que en otros países esto podría tratarse como el 12 de enero.

Al emitir declaraciones directamente en SSMS, uso el formato yyyymmdd que parece ser bastante general. No encontré ningún problema en las diversas instalaciones en las que trabajé hasta ahora.

Hay otro formato que se usa con poca frecuencia, que es un poco extraño pero funciona para todas las versiones:

select { d '2013-10-01' }

volverá el primero de octubre de 2013.

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

Regresará el 1 de octubre, 1:45:01 PM

Recomiendo encarecidamente usar parámetros y nunca formatear su propio código SQL pegando fragmentos de declaración formateados de cosecha propia. Es una entrada para inyección SQL y errores extraños (formatear un valor flotante es otro problema potencial)

alzaimar
fuente
3

Tu primer código funcionará haciendo esto

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

Su problema está en la propiedad "Fecha" que se trunca DateTimesolo hasta la fecha. Podrías poner la conversión así:

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

La respuesta que estaba buscando era:

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

También aprendí que puedes hacerlo de esta manera:

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

donde myCountryDateFormat se puede cambiar para cumplir con el cambio según los requisitos.

Tenga en cuenta que la etiqueta "Esta pregunta puede que ya tenga una respuesta aquí:" en realidad no ha respondido a la pregunta porque, como puede ver, utilizó un ".Date" en lugar de omitirlo. Es bastante confuso para los nuevos programadores de .NET

Ace Caserya
fuente
2

si desea almacenar la fecha actual en la tabla para que pueda usar

OBTENER LA FECHA();

o pasar esta función como parámetro

p.ej. 'actualizar tblname set curdate = GETDATE () donde colname = 123'

Manohar Patil
fuente
1

¿Por qué no omitir la cadena por completo?

SqlDateTime myDateTime = DateTime.Now;
Steve D
fuente
1

Tu problema está en la Datepropiedad que se trunca DateTimesolo hasta la fecha. Podrías poner la conversión así:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");
nanthakumar
fuente
Gracias. Justo lo que estaba buscando;) Sorprendido, Microsoft no agregó una bandera o comando para hacer esto más brevemente.
Zeek2
0

Otra solución para pasar DateTime de C # a SQL Server, independientemente de la configuración de idioma de SQL Server

supuestamente que su configuración regional muestra la fecha como dd.MM.yyyy (estándar alemán '104') luego

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

pasa la variable de fecha y hora de C # a la variable de tipo de fecha de SQL Server, considerando la asignación según las reglas "104". La fecha del servidor SQL es aaaa-MM-dd

Si su configuración regional muestra la fecha y hora de manera diferente, use la coincidencia adecuada de la tabla CONVERT de SQL Server

ver más sobre Reglas: https://www.techonthenet.com/sql_server/functions/convert.php

Jorge
fuente
0

Creo que el problema era que faltaban las dos comillas simples.

Este es el sql que ejecuto en MSSMS:

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

Como puede ver, hay dos comillas simples, por lo que sus códigos deben ser:

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

Utilice comillas simples para cada cadena en MSSQL o incluso en MySQL. Espero que esto ayude.

Joshua Dawi Abejero
fuente
0

Usemos la clase SqlDateTime incorporada

new SqlDateTime(DateTime.Now).ToSqlString()

Pero aún es necesario verificar los valores nulos. Esto arrojará una excepción de desbordamiento

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.

mkb
fuente
-1

solo pones "T" + DateTime.Now.ToLongTimeString () + '2015-02-23'

Francisco Mier YTerán
fuente
primero la fecha XD fecha + "T" + DateTime.Now.ToLongTimeString ()
Francisco Mier YTerán
-1

Si desea actualizar una tabla con ese dateTime, puede usar su cadena sql como este ejemplo:

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());
Rodrigo Uzcanga
fuente
2
Esta pregunta ya ha sido respondida y aceptada con una solución más elegante. Y te falta un cierre ".
Ene
-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();
ahmed adam ahmed abdel rahman
fuente