2009-01-22 8 views
6

Me preguntaba cuál es la mejor manera de analizar un objeto DateTime en su servidor SQL.Mejor manera de analizar DateTime en el servidor SQL

Donde está generando el SQL en el código.

Siempre he usado algo así como DateTime.Now.TolongDateString() y tuve buenos resultados, aparte de hoy en que recibí un error, y me hizo pensar.

System.Data.SqlClient.SqlException: Conversion failed when converting datetime from character string 

Entonces, ¿qué es todo el mundo pensamientos y recomendaciones de una manera que funcione acrss todos los servidores SQL no importa lo que hay configuración ..

tal vez algo como DateTime.Now.ToString("yyyy/MM/dd")

+0

Ahora he estado usando .ToString ("aaaa-MM-dd HH: mm: ss: fff") que parece funcionar bien – TheAlbear

Respuesta

14

sólo hay 2 formatos seguras

ISO y ISO8601

ISO = aammdd

ISO8601 = aaaa-mm-dd THH: mm: ss: mmm (sin espacios) (observe la T)

Ver también aquí: Setting a standard DateFormat for SQL Server

+0

Tengo miedo de que no sea cierto en el la base de datos incluso la cadena '1997-12-09' puede tratarse como el 9 de diciembre o el 12 de septiembre dependiendo de la configuración de la base de datos. Por lo tanto, nunca se garantiza cómo se tratará la cadena que pasa al DB a menos que especifique el formato. – kristof

+3

Kristof, si vas a usar guiones en el formato, entonces necesitas usar la T. Si eliminas los guiones, nunca se interpretarán mal. En lugar de '1997-12-09' use '19971209'. –

+0

Gracias Mastros - No era consciente de eso, supongo que puedes aprender algo todos los días :) – kristof

1

Formateo usando DateTime.ToString (" aaaa-MM-dd HH: mm: ss: fff ") coincidirá con el formato de fecha/hora del servidor MS SQL. (Creo que SQL Server es bastante "inteligente" al reconocer formatos ligeramente diferentes, por ejemplo, con barras, pero personalmente lo utilicé con éxito).

EDITAR: Como señaló el comentarista, esto probablemente se arruine en algunos lugares

+0

este será un error para la configuración regional ydm –

3

éste no siempre va a fallar: DateTime.Now.ToString ("AAAAMMDD HH: mm: ss.fff")

10

Por qué no parametrizar la consulta y pasar el valor de fecha y hora como un parámetro de entrada DateTime de SQL ?

por ejemplo INSERT INTO SomeTable (Blah, MyDateTime) VALUES (1, @MyDateTime)

entonces puede estar realmente seguro. Incluso si está generando SQL, ¿debería poder manejar esto específicamente?

3

Tenga cuidado si la fecha es DateTime.Min, ya que SQL Server usa 1700 para el inicio del tiempo. Usaría un formato de fecha y hora ISO: DateTime.ToString ("s") pero no lo he intentado en instalaciones no occidentales.

p. Ej.

DateTime.Now.ToString("c") 

es

insert into testtable values ('2009-01-22T15:08:13') 
5

que realmente debe utilizar consultas parametrizadas para eso y pasar su DateTime objeto como un parámetroDateTime de SQL.

Si analizar el DateTime a cadena que tendrá que hacer frente a los ajustes de localización tanto en el servidor de aplicaciones como en el servidor de base de datos. Eso puede llevar a algunas sorpresas desagradables, como tratar la fecha como estaba en formato de EE. UU. En un lado y p. Reino Unido en otro.La cadena 9/12/2000 puede ser el 12 de septiembre o el 9 de diciembre. Por lo tanto, guarde los datos en el objeto/tipo DateTime al intercambiar entre la aplicación y la base de datos.

La única vez que puedas procesar DateTime a cadena sería cuando se muestran los datos de usuario (GUI). Pero luego debe asegurarse de utilizar la configuración de localización adecuada al analizar para mostrarla en el formato que el usuario espera.

El mismo principio se aplica a otros tipos de datos como float por ejemplo. La representación de cadena de esto varía según la configuración regional y supongo que no analiza float a String al pasarlo a la base de datos, entonces ¿por qué hacerlo con DateTime?

10

que encontré fue necesario este formato específico:

DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff") 

Nota carcasa y la ausencia de espacios. Esta es la forma universal de acuerdo con Robyn Page.

Cuestiones relacionadas