2012-04-27 50 views
6

Estoy almacenando en mi base de datos mediante un procedimiento tienda de la marca de tiempo fecha usando una función llamada sysdatetime() y un tipo de varchar(max) que almacena en la base de datos en este formato yyyy-mm-dd hh:mm:ss.sssssss. Cuando estoy creando una nueva entrada de su bien, pero cuando estoy tratando de actualizar el registro tengo que enviar un parámetro para el procedimiento de la tienda con la corriente datetime. He intentado este¿Cómo puedo convertir DateTime.now en C# para aaaa-mm-dd hh: mm: ss.sssssss?

DateTime.Now.ToString(yyyy-mm-dd hh:mm:ss.sssssss) 

pero me sale un error. ¿lo que tengo que hacer?

PD: ver la imagen a continuación con el mensaje de error

enter image description here

+0

¿Cuál es el tipo de datos SQL del parámetro que está pasando en? –

+2

No guarde las fechas como cadenas: guárdelas como 'date' o' datetime' o 'datetime2' (según corresponda). No * pase * fechas a la base de datos como cadenas. Páselos a su código de acceso a datos (ya sea NHibernate, simple ADO.Net, Entity Framework, etc.) como 'DateTimes'. Haga los parámetros de los procedimientos almacenados, etc., acepta 'datetime'.El * único * lugar donde debe convertir una fecha/hora en una cadena está en * el último momento posible * antes de que se muestre al usuario de su sistema. –

Respuesta

21

Sospecho que si realmente necesita el representación de cadena, que en realidad desea:

string text = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fffffff", 
             CultureInfo.InvariantCulture) 

Tenga en cuenta que:

  • A menos que realmente desea que la hora local, utilice UtcNow en lugar de Now. Para las marcas de tiempo, casi siempre quiere UTC.
  • Dudo que desea utilizar el separador de hora de la cultura actual, por lo tanto, la especificación de CultureInfo.InvariantCulture
  • "MM" significa meses, mientras que "mm" significa minuto
  • "HH" significa reloj de 24 horas, mientras que " hh" significa reloj de 12 horas
  • 'ff ...' se utiliza para fracciones de segundo

Ver MSDN para más detalles del formato de fecha y hora.

Sin embargo, yo fuertemente recomiendo evitar las conversiones de cadenas siempre que sea posible. ¿Por qué el procedimiento almacenado no puede usar el tipo de DateTime relevante en lugar de una representación de cadena? A continuación, puede pasar el valor al procedimiento almacenado como DateTime un (a través de un parámetro de comando) y usted puede deshacerse del desorden de conversión de cadenas propenso a errores.

+0

@ PreguntonCojoneroCabrón: Sí, eso es absolutamente posible, pero no has dicho nada sobre lo que has intentado o lo que sucedió. ¿Leyó la página enlazada de MSDN? –

+0

Intento: 'var value = DateTime.Now.ToUniversalTime(). ToString (" aaaa-MM-dd @ hh: mm: ss UTC ");' –

+0

@ PreguntonCojoneroCabrón: ¿Y cuál fue el resultado? Desea 'HH' en lugar de' hh', y debe citar la parte 'UTC'. Además, use 'DateTime.UtcNow' en lugar de' DateTime.Now.ToUniversalTime() '. –

0

Aquí una pequeña muestra:

DateTime date3 = new DateTime(2008, 1, 1, 0, 30, 45, 125); 
Console.WriteLine("Date with milliseconds: {0:MM/dd/yyy hh:mm:ss.fff}", 
        date3); 
// Displays the following output to the console: 
//  Date with milliseconds: 01/01/2008 12:30:45.125 

Sólo hay que poner el número apropiado de s "f" en su comando y ya está

+1

No da el formato solicitado, sigue usando el reloj de 12 horas y será específico para cada cultura. –

+0

thx para corregirme Jon – MUG4N

Cuestiones relacionadas