Problema con fechas. SQL Server 2000 to SQL Server 2005

05/03/2007 - 13:22 por gabriel.jaume | Informe spam
Hola a tod@s,

Estoy migrando una base de datos de sql server 2000 a 2005, y me he
encontrado un gran problema con el tema de las fechas.

En la base de datos todas las fechas están en campos "datetime" en el
formato español "dd/mm/yyyy hh:mm:ss", y parece ser que SQL Server
2005 trabaja con fechas en formato americano "mm/dd/yyyy hh:mm:ss".

Los procedimientos almacenado que tienen parámetros del tipo
"datetime" ahora fallan dando el error:
"Error converting data type nvarchar to datetime." Cuando le paso una
fecha que pasa del día 12...

Por otro lado, a la hora de insertar registros ahora los inserta en
formato americano... Y al mostrarlos por pantalla se muestra en
formato español tomando el mes por el dia y viceversa.

Alguien sabe como puedo solucionar este problema?

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
05/03/2007 - 16:18 | Informe spam
Gabi,

El sp para cambiar el lenguaje por defecto para un login especifico es
[sp_defaultlanguage].

Ejemplo:

USE [master]
GO
EXEC master.dbo.sp_defaultlanguage @loginame = N'alejandro', @language =
N'Spanish'
GO.

Este tema no es muy claro que digamos. Cuando ejecutamos el sp desde QA,
SSMS, o llamada directa desde una aplicacion usando "execute dbo.p1 ...",
podemos pasarle el valor del parametro usando los formatos 112 y/o 126 (ver
funcion CONVERT en los BOL) y todo queda en casa. Pero cuando intentamos usar
ADO o ADO.NET, y queremos implementar un objeto tipo "command" o
"sqlcommand", los parametros los definimos casi siempre como "datetime", sin
embargo nuestro sistema operativo (el lado del cliente) puede estar usando un
seteo especifico de alguna region o lenguaje, asi que cuando asignamos, por
ejemplo, Datetime.Now.toString(), este valor tendra el formato de acuerdo al
seteo del SO y si SQL Server usa un seteo diferente entonces la asignacion
falla en el lado del servidor. Si intentamos formatear el valor de
Datetime.Now.toString() para usar formato ANSI y asignamos el valor a un
parametro datetime, esta asignacion falla en el lado del cliente. Que hacemos
entonces?. Una forma seria declarando los parametros "datetime" como
"varchar" en ADO/ADO.NET y por tanto pueden aceptar la cadena "yyyymmdd", al
pasarle ese valor al sp en el servidor, SQL Server hace una traduccion de
estas constantes a valor datetime. Que problema podemos tener?. Un problema
seria que la aplicacion cliente debe asegirar que las constantes de fecha en
formato de cadena, sean en realidad valores de fecha, de lo contrario el sp
fallara en lado del servidor al tratar de convertor la constante de cadena a
valor fecha.

Voy a poner un ejemplo. En la db "northwind", tenemos un sp llamado
"dbo.[Sales by Year]", que espera dos parametros tipo "datetime". En el
codigo vb.net, declaro los parametros tipo "varchar" para poder pasar los
valores con formato ANSI. Si cambio el tipo de parametro a "datetime", al
tratar de ejecutar sqlcmd.executereader() recivo un error porque mi SO
(windows xp pro) esta usando seteo para ingles y al tratar de asignar
'19980101', lo interpreta como mm/dd/yyyy y no hay 19 meses. Fijense que el
error aqui ocurre en el codigo .net y no en el servidor.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim myConnection As New SqlConnection
Dim sqlCmd As New SqlCommand
Dim dr As SqlDataReader

myConnection.ConnectionString = "Persist Security
Info=False;Integrated Security=SSPI;database=northwind;server=(Local);Connect
Timeout0"

sqlCmd.CommandText = "dbo.[Sales by Year]"
sqlCmd.CommandType = CommandType.StoredProcedure

sqlCmd.Parameters.Add("@Beginning_Date", SqlDbType.VarChar, 8).Value
= "19980101"
sqlCmd.Parameters.Add("@Ending_Date", SqlDbType.VarChar, 8).Value =
"19981231"

sqlCmd.Connection = myConnection

myConnection.Open()

dr = sqlCmd.ExecuteReader()
dr.Read()

Console.WriteLine(String.Format("{0}, {1}", dr(0), dr(1)))

dr.Close()
myConnection.Close()
sqlCmd = Nothing
myConnection = Nothing
dr = Nothing

End Sub


AMB

"Gabi" wrote:

On 5 mar, 16:13, "Maxi" wrote:
> Gabi, a ver, el manejo de fechas para que no tengas problemas debe ser
> siempre en ANSI, esto evitara estos cambios. Segungo, no es un problema de
> SQL2005 ya que en 2000 tambien pasa, el tipo de formato de la fecha lo
> define el login y no SQLServer, fijate con que login estas entrando al
> sistema y revisa que fecha tiene, fijate en 2000 y revisa que sea el mismo.
> La opcion mas rapida en tu caso es poner el mismo idioma al login que tenias
> en 2000, una solucion de fondo es cambiar los Stores o lo que fuere para que
> trabajen con formato ANSI.
> Los SP no deberian devolver la data en ningun formato convertido, ya que
> puede suceder que tengas usuarios de distintas nacionalidades y en ese caso
> que haras? un SP por cada nacionalidad? para ello esta el idioma en el
> login, entonces en tu SP devolve la fecha sin convert ni nada por el estilo
> y todo lo que sea formateo lo debes hacer en la capa de presentacion llegado
> el caso.
>
> Espero haber sido claro :S
>
> "Gabi" escribió en el mensajenews:
> On 5 mar, 15:36, "Maxi" wrote:
>
>
>
>
>
> > Hola, esto es porque no estas manejando bien las fechas, te paso un
> > articulo
> > que escribi ya hace bastante tiempo
>
> >http://www.microsoft.com/spanish/ms.../art157...
>
> > escribió en el
> > mensajenews:
> > Hola a ,
>
> > Estoy migrando una base de datos de sql server 2000 a 2005, y me he
> > encontrado un gran problema con el tema de las fechas.
>
> > En la base de datos todas las fechas están en campos "datetime" en el
> > formato español "dd/mm/yyyy hh:mm:ss", y parece ser que SQL Server
> > 2005 trabaja con fechas en formato americano "mm/dd/yyyy hh:mm:ss".
>
> > Los procedimientos almacenado que tienen parámetros del tipo
> > "datetime" ahora fallan dando el error:
> > "Error converting data type nvarchar to datetime." Cuando le paso una
> > fecha que pasa del día 12...
>
> > Por otro lado, a la hora de insertar registros ahora los inserta en
> > formato americano... Y al mostrarlos por pantalla se muestra en
> > formato español tomando el mes por el dia y viceversa.
>
> > Alguien sabe como puedo solucionar este problema?
>
> Hola Maxi,
>
> Lo he leido y es muy muy interesante. Teniendo en cuenta mi situación
> actual en la que tengo un proyecto de una magnitud bastante grande
> funcionando con el formato de fechas en español con las siguientes
> premisas:
> 1. Todo acceso a datos está implementado a través de store procedures.
> 2. Existe una capa de datos intermedia en C# que lanza todos estos
> store procedures.
> - Los parametros fecha, en la clase de datos son siempre strings y
> es aquí donde ocurre uno de los problemas, ya que con sql server 2005
> el auto cast lo hace sobre una fecha en formato americano. Me
> aconsejarías hacer un convert(datetime, @fecha, 103) en cada store
> procedure?
> 3. En muchos casos, paso como parámetro Datetime.Now.toString() el
> cual me da la fecha en formato español, lo tengo que cambiar a formato
> ANSI Standar o americano por todo?
>
> No tengo muy claro cual es la mejor forma de adaptar el proyecto
> que me aconsejas?- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -


Claro como el agua :)

Así lo haré, como trabajo de fondo, que no es poco ya que tienes toda
la razón en lo que dices.

Gracias por tus consejos.


Respuesta Responder a este mensaje
#7 Fernando Espana
06/03/2007 - 06:32 | Informe spam
Solucion no ortodoxa pero drastica si no tienes acceso a modificar la forma
de almacenar datos

set language to spanish

al inicio de tus sp y no tendras problemas


"Alejandro Mesa" escribió en el
mensaje de noticias
news:
Gabi,

El sp para cambiar el lenguaje por defecto para un login especifico es
[sp_defaultlanguage].

Ejemplo:

USE [master]
GO
EXEC master.dbo.sp_defaultlanguage @loginame = N'alejandro', @language > N'Spanish'
GO.

Este tema no es muy claro que digamos. Cuando ejecutamos el sp desde QA,
SSMS, o llamada directa desde una aplicacion usando "execute dbo.p1 ...",
podemos pasarle el valor del parametro usando los formatos 112 y/o 126
(ver
funcion CONVERT en los BOL) y todo queda en casa. Pero cuando intentamos
usar
ADO o ADO.NET, y queremos implementar un objeto tipo "command" o
"sqlcommand", los parametros los definimos casi siempre como "datetime",
sin
embargo nuestro sistema operativo (el lado del cliente) puede estar usando
un
seteo especifico de alguna region o lenguaje, asi que cuando asignamos,
por
ejemplo, Datetime.Now.toString(), este valor tendra el formato de acuerdo
al
seteo del SO y si SQL Server usa un seteo diferente entonces la asignacion
falla en el lado del servidor. Si intentamos formatear el valor de
Datetime.Now.toString() para usar formato ANSI y asignamos el valor a un
parametro datetime, esta asignacion falla en el lado del cliente. Que
hacemos
entonces?. Una forma seria declarando los parametros "datetime" como
"varchar" en ADO/ADO.NET y por tanto pueden aceptar la cadena "yyyymmdd",
al
pasarle ese valor al sp en el servidor, SQL Server hace una traduccion de
estas constantes a valor datetime. Que problema podemos tener?. Un
problema
seria que la aplicacion cliente debe asegirar que las constantes de fecha
en
formato de cadena, sean en realidad valores de fecha, de lo contrario el
sp
fallara en lado del servidor al tratar de convertor la constante de cadena
a
valor fecha.

Voy a poner un ejemplo. En la db "northwind", tenemos un sp llamado
"dbo.[Sales by Year]", que espera dos parametros tipo "datetime". En el
codigo vb.net, declaro los parametros tipo "varchar" para poder pasar los
valores con formato ANSI. Si cambio el tipo de parametro a "datetime", al
tratar de ejecutar sqlcmd.executereader() recivo un error porque mi SO
(windows xp pro) esta usando seteo para ingles y al tratar de asignar
'19980101', lo interpreta como mm/dd/yyyy y no hay 19 meses. Fijense que
el
error aqui ocurre en el codigo .net y no en el servidor.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim myConnection As New SqlConnection
Dim sqlCmd As New SqlCommand
Dim dr As SqlDataReader

myConnection.ConnectionString = "Persist Security
Info=False;Integrated
Security=SSPI;database=northwind;server=(Local);Connect
Timeout0"

sqlCmd.CommandText = "dbo.[Sales by Year]"
sqlCmd.CommandType = CommandType.StoredProcedure

sqlCmd.Parameters.Add("@Beginning_Date", SqlDbType.VarChar,
8).Value
= "19980101"
sqlCmd.Parameters.Add("@Ending_Date", SqlDbType.VarChar, 8).Value > "19981231"

sqlCmd.Connection = myConnection

myConnection.Open()

dr = sqlCmd.ExecuteReader()
dr.Read()

Console.WriteLine(String.Format("{0}, {1}", dr(0), dr(1)))

dr.Close()
myConnection.Close()
sqlCmd = Nothing
myConnection = Nothing
dr = Nothing

End Sub


AMB

"Gabi" wrote:

On 5 mar, 16:13, "Maxi" wrote:
> Gabi, a ver, el manejo de fechas para que no tengas problemas debe ser
> siempre en ANSI, esto evitara estos cambios. Segungo, no es un problema
> de
> SQL2005 ya que en 2000 tambien pasa, el tipo de formato de la fecha lo
> define el login y no SQLServer, fijate con que login estas entrando al
> sistema y revisa que fecha tiene, fijate en 2000 y revisa que sea el
> mismo.
> La opcion mas rapida en tu caso es poner el mismo idioma al login que
> tenias
> en 2000, una solucion de fondo es cambiar los Stores o lo que fuere
> para que
> trabajen con formato ANSI.
> Los SP no deberian devolver la data en ningun formato convertido, ya
> que
> puede suceder que tengas usuarios de distintas nacionalidades y en ese
> caso
> que haras? un SP por cada nacionalidad? para ello esta el idioma en el
> login, entonces en tu SP devolve la fecha sin convert ni nada por el
> estilo
> y todo lo que sea formateo lo debes hacer en la capa de presentacion
> llegado
> el caso.
>
> Espero haber sido claro :S
>
> "Gabi" escribió en el
> mensajenews:
> On 5 mar, 15:36, "Maxi" wrote:
>
>
>
>
>
> > Hola, esto es porque no estas manejando bien las fechas, te paso un
> > articulo
> > que escribi ya hace bastante tiempo
>
> >http://www.microsoft.com/spanish/ms.../art157...
>
> > escribió en el
> > mensajenews:
> > Hola a ,
>
> > Estoy migrando una base de datos de sql server 2000 a 2005, y me he
> > encontrado un gran problema con el tema de las fechas.
>
> > En la base de datos todas las fechas están en campos "datetime" en el
> > formato español "dd/mm/yyyy hh:mm:ss", y parece ser que SQL Server
> > 2005 trabaja con fechas en formato americano "mm/dd/yyyy hh:mm:ss".
>
> > Los procedimientos almacenado que tienen parámetros del tipo
> > "datetime" ahora fallan dando el error:
> > "Error converting data type nvarchar to datetime." Cuando le paso una
> > fecha que pasa del día 12...
>
> > Por otro lado, a la hora de insertar registros ahora los inserta en
> > formato americano... Y al mostrarlos por pantalla se muestra en
> > formato español tomando el mes por el dia y viceversa.
>
> > Alguien sabe como puedo solucionar este problema?
>
> Hola Maxi,
>
> Lo he leido y es muy muy interesante. Teniendo en cuenta mi situación
> actual en la que tengo un proyecto de una magnitud bastante grande
> funcionando con el formato de fechas en español con las siguientes
> premisas:
> 1. Todo acceso a datos está implementado a través de store procedures.
> 2. Existe una capa de datos intermedia en C# que lanza todos estos
> store procedures.
> - Los parametros fecha, en la clase de datos son siempre strings y
> es aquí donde ocurre uno de los problemas, ya que con sql server 2005
> el auto cast lo hace sobre una fecha en formato americano. Me
> aconsejarías hacer un convert(datetime, @fecha, 103) en cada store
> procedure?
> 3. En muchos casos, paso como parámetro Datetime.Now.toString() el
> cual me da la fecha en formato español, lo tengo que cambiar a formato
> ANSI Standar o americano por todo?
>
> No tengo muy claro cual es la mejor forma de adaptar el proyecto
> que me aconsejas?- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -


Claro como el agua :)

Así lo haré, como trabajo de fondo, que no es poco ya que tienes toda
la razón en lo que dices.

Gracias por tus consejos.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida