formato de fechas

29/10/2003 - 14:31 por Virginia | Informe spam
Hola a todos, no sé si es posible, en ese caso, si alguien
me puede ayudar a resolver mi problema: necesito modificar
el formato de las fechas en una base de datos y no sé cómo
se hace, busqué y no encontré nada.
En el caso de que se pueda, es a nivel base de datos o a
nivel del SQL Server (o sea, todas las bases que cree
quedarían con la misma configuración)?
Muchas gracias

Preguntas similare

Leer las respuestas

#11 Javier Loria
29/10/2003 - 17:03 | Informe spam
Hola:
Wow!!!, un placer leerte.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Fernando G. Guerrero escribio:
SQL Server almacena las fechas siempre en un formato binario que es
independiente del formato de salida que seleccione el usuario. Este
formato binario es el conjunto de dos partes, una que representa la
fecha (número de días desde la fecha origen) y otra parte representa
hora (número de ticks desde medianoche).

Si se trata de un smalldatetime, la parte de fecha se almacena como el
número días que han pasado desde el 1 de Enero de 1900, si se trata
de un campo datetime, este valor sería negativo si se tratara de una
fecha anterior al 1 de Enero de 1900.

Si se trata de un smalldatetime, la parte de hora almacena el número
de minutos que han pasado desde la medianoche, mientras que si se
trata de un campo datetime, la parte de hora almacenará cuántos
trescientosavos de segundo han pasado desde la medianoche.

Si quieres ver cómo SQL Server almacena estos valores binarios,
ejecuta el siguiente script:

USE Tempdb
GO

CREATE TABLE Mifecha (Fecha datetime,
Fechita smalldatetime)

INSERT MiFecha
SELECT Getdate(), GetDate()

INSERT MiFecha
SELECT '1/1/1800', GetDate()

INSERT MiFecha
SELECT '1/1/1800 10:15', GetDate()

GO


SELECT *
FROM sysindexes
WHERE id = OBJECT_ID('MiFecha')


DBCC TRACEON(3604)

DBCC PAGE (Tempdb, 1, 75, 3)

/* verás que hay tres registros con los valores que has almacenado
En mi caso, he obtenido esto:

Slot 0 Offset 0x60

Record Type = PRIMARY_RECORD
Record Attributes = NULL_BITMAP
1A786060: 00100010 00610fa5 00009421 94210161 ..a.!...a.!.
1A786070: 000002 ...
Fecha = Oct 29 2003 5:53AM
Fechita = Oct 29 2003 5:53AM

Slot 1 Offset 0x73

Record Type = PRIMARY_RECORD
Record Attributes = NULL_BITMAP
1A786073: 00100010 00000000 ffff7154 94210167 Tq..g.!.
1A786083: 000002 ...
Fecha = Jan 1 1800 12:00AM
Fechita = Oct 29 2003 5:59AM

Slot 2 Offset 0x86

Record Type = PRIMARY_RECORD
Record Attributes = NULL_BITMAP
1A786086: 00100010 00a8ea30 ffff7154 9421016e 0...Tq..n.!.
1A786096: 000002 ...
Fecha = Jan 1 1800 10:15AM
Fechita = Oct 29 2003 6:06AM

Si jugamos un poco con valores hexadecimales,

0x9421 = 37921 dias

*/

SELECT DATEADD(day, 37921, '1/1/1900')



SELECT DATEADD(day, -36524, '1/1/1900')


Respuesta Responder a este mensaje
#12 Fernando G. Guerrero
29/10/2003 - 17:14 | Informe spam
Cada motor de base de datos lidia con fechas de un modo diferente, así que
si quieres hacer algo realmente general, no vas a tener más remedio que
convertir tus fechas al formato canónigo de ODBC (yyy-mm-dd) en la
aplicación de cliente, antes de enviarlo al motor de base de datos. Este
formato lo admiten la gran mayoría de los motores de bases de datos.

Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

wrote in message
news:0d8d01c39e35$ff503e10$
si, por ahí esto me sirve, pero lo estoy probando desde la
aplicación y me da error. Dónde lo tengo que poner ? Me va
a dar error con cualquier otro motor de base de datos?
porque mi aplicacion es totalmente adaptable a cualquier
motor y no a una sola.

Se me ha olvidado comentar que utilizando SET DATEFORMAT


desde la aplicación
de cliente, la inserción se hará siempre correctamente


independientemente
del idioma que se haya utilizado para instalar SQL Server.

Y el valor 'dmy' lo puedes pasar como variable también.

Por otro lado, si creas tus logins en SQL Server con el


idioma correcto, SQL
Server es asignará automáticamente el formato de fecha


adecuado a sus
opciones regionales.

Crea los siguientes logins:

if not exists (select * from master.dbo.syslogins where


loginname >N'Pedro')
BEGIN
declare @logindb nvarchar(132), @loginlang nvarchar(132)


select @logindb >N'master', @loginlang = N'Español'
if @logindb is null or not exists (select * from


master.dbo.sysdatabases
where name = @logindb)
select @logindb = N'master'
if @loginlang is null or (not exists (select * from


master.dbo.syslanguages
where name = @loginlang) and @loginlang <> N'us_english')
select @loginlang = @@language
exec sp_addlogin N'Pedro', null, @logindb, @loginlang
END

GO

if not exists (select * from master.dbo.syslogins where


loginname >N'Peter')
BEGIN
declare @logindb nvarchar(132), @loginlang nvarchar(132)


select @logindb >N'master', @loginlang = N'us_english'
if @logindb is null or not exists (select * from


master.dbo.sysdatabases
where name = @logindb)
select @logindb = N'master'
if @loginlang is null or (not exists (select * from


master.dbo.syslanguages
where name = @loginlang) and @loginlang <> N'us_english')
select @loginlang = @@language
exec sp_addlogin N'Peter', null, @logindb, @loginlang
END
GO

Ahora conéctate a SQL Server con el login Pedro y ejecuta


el comando: DBCC
USEROPTIONS
Ahora conéctate a SQL Server con el login Peter y ejecuta


el comando: DBCC
USEROPTIONS

Verás que el valor de dateformat es distinto para ambos


logins.

Espero que esto sí te sea de ayuda :-)


Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

"Fernando G. Guerrero" wrote in


message
news:
El problema es que al enviar fechas a SQL Server en




modo texto, SQL Server
tiene que interpretar de qué fecha se trata y el




formato de texto depende
de
las opciones regionales de la máquina.

Sin embargo, puedes utilizar el formato SET DATEFORMAT




para especificar en
que orden tu aplicación de cliente envia la fecha:

USE Tempdb
GO

CREATE TABLE MyDate (fecha datetime)

GO


SET DATEFORMAT dmy

INSERT MyDate VALUES ('16/02/1959')
GO



SET DATEFORMAT mdy

INSERT MyDate VALUES ('02/16/1959')
GO

SELECT *
FROM MyDate


Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

"Virginia" wrote in message
news:0f7101c39e2b$d5337ed0$
Fernando, muy buena tu explicación, pero no me sirve de
mucho, por qué? porque yo tengo una aplicación que debe
ser adaptable a cualquier motor, por eso mismo, yo seteo
las máscaras desde la aplicacion segun la base de datos,
si es como vos decís, para cualquier máscara debería
funcionar un insert, y sin embargo me da error, sólo




toma
la siguiente máscara: yyyy-dd-mm hh:mm:ss.000, porque el
SQL está en inglés, pero para uno en castellano esa
máscara no me sirve, o sea, quiero poder manejar y




setear
la máscara desde la base de datos, para que tenga la




misma
que la aplicacion.
En la respuesta a otro mail de Carlos, lo expliqué




mejor.

>Es que son las 6 de la mañana en Los Angeles y me ha
apetecido escribir un
>poso ;-)
>
>Fernando G. Guerrero
>SQL Server MVP
>CEO & Principal Mentor
>Solid Quality Learning
>www.solidqualitylearning.com
>
>"Comparte lo que sabes, aprende lo que no sepas"
>
>"Carlos Sacristan" wrote in




message
>news:%
>>
>> :-O
>>
>> Wow, Fernando. El día que pregunten algo más
complejo vas a tener que
>> anexar un manual en vez de un simple comentario ;-)
>>
>> Siempre un placer leerte de nuevo por aquí
>>
>>
>>
>> Un saludo
>>
>> -
>> "Sólo sé que no sé nada. " (Sócrates)
>> MVP SQL Server
>> Por favor, responder únicamente al foro
>> Se agradece la inclusión de sentencias DDL
>>
>>
>> "Fernando G. Guerrero"




escribió
en el mensaje
>> news:
>> > SQL Server almacena las fechas siempre en un




formato
binario que es
>> > independiente del formato de salida que seleccione




el
usuario. Este
>> formato
>> > binario es el conjunto de dos partes, una que
representa la fecha
>(número
>> de
>> > días desde la fecha origen) y otra parte representa
hora (número de
>ticks
>> > desde medianoche).
>> >
>> > Si se trata de un smalldatetime, la parte de fecha




se
almacena como el
>> > número días que han pasado desde el 1 de Enero de
1900, si se trata de
>un
>> > campo datetime, este valor sería negativo si se
tratara de una fecha
>> > anterior al 1 de Enero de 1900.
>> >
>> > Si se trata de un smalldatetime, la parte de hora
almacena el número de
>> > minutos que han pasado desde la medianoche,




mientras
que si se trata de
>un
>> > campo datetime, la parte de hora almacenará cuántos
trescientosavos de
>> > segundo han pasado desde la medianoche.
>> >
>> > Si quieres ver cómo SQL Server almacena estos




valores
binarios, ejecuta
>el
>> > siguiente script:
>> >
>> > USE Tempdb
>> > GO
>> >
>> > CREATE TABLE Mifecha (Fecha datetime,
>> > Fechita smalldatetime)
>> >
>> > INSERT MiFecha
>> > SELECT Getdate(), GetDate()
>> >
>> > INSERT MiFecha
>> > SELECT '1/1/1800', GetDate()
>> >
>> > INSERT MiFecha
>> > SELECT '1/1/1800 10:15', GetDate()
>> >
>> > GO
>> >
>> >
>> > SELECT *
>> > FROM sysindexes
>> > WHERE id = OBJECT_ID('MiFecha')
>> >
0x4B0000000100,
almacenan los
>> >
>> > DBCC TRACEON(3604)
>> >
>> > DBCC PAGE (Tempdb, 1, 75, 3)
>> >
>> > /* verás que hay tres registros con los valores que
has almacenado
>> > En mi caso, he obtenido esto:
>> >
>> > Slot 0 Offset 0x60
>> >
>> > Record Type = PRIMARY_RECORD
>> > Record Attributes = NULL_BITMAP
>> > 1A786060: 00100010 00610fa5 00009421
94210161 ..a.!...a.!.
>> > 1A786070:




000002 ...
>> > Fecha = Oct 29 2003




5:53AM
>> > Fechita = Oct 29 2003




5:53AM
>> >
>> > Slot 1 Offset 0x73
>> >
>> > Record Type = PRIMARY_RECORD
>> > Record Attributes = NULL_BITMAP
>> > 1A786073: 00100010 00000000 ffff7154
94210167 Tq..g.!.
>> > 1A786083:




000002 ...
>> > Fecha = Jan 1 1800




12:00AM
>> > Fechita = Oct 29 2003




5:59AM
>> >
>> > Slot 2 Offset 0x86
>> >
>> > Record Type = PRIMARY_RECORD
>> > Record Attributes = NULL_BITMAP
>> > 1A786086: 00100010 00a8ea30 ffff7154
9421016e 0...Tq..n.!.
>> > 1A786096:




000002 ...
>> > Fecha = Jan 1 1800




10:15AM
>> > Fechita = Oct 29 2003




6:06AM
>> >
>> > Si jugamos un poco con valores hexadecimales,
>> >
>> > 0x9421 = 37921 dias
>> >
>> > */
>> >
>> > SELECT DATEADD(day, 37921, '1/1/1900')
>> >
>> >
256*256*256*256)
>> >
>> > SELECT DATEADD(day, -36524, '1/1/1900')
>> >
>> >
ejecut;e el script)
minutos = 10:15
>> >
>> >
>> >
>> >
>> >
>> > Fernando G. Guerrero
>> > SQL Server MVP
>> > CEO & Principal Mentor
>> > Solid Quality Learning
>> > www.solidqualitylearning.com
>> >
>> > "Comparte lo que sabes, aprende lo que no sepas"
>> >
>> > "Virginia" wrote in message
>> > news:04f301c39e21$004272d0$
>> > Hola a todos, no sé si es posible, en ese caso, si
alguien
>> > me puede ayudar a resolver mi problema: necesito
modificar
>> > el formato de las fechas en una base de datos y no





cómo
>> > se hace, busqué y no encontré nada.
>> > En el caso de que se pueda, es a nivel base de




datos
o a
>> > nivel del SQL Server (o sea, todas las bases que




cree
>> > quedarían con la misma configuración)?
>> > Muchas gracias
>> >
>> >
>>
>>
>
>
>.
>






.

Respuesta Responder a este mensaje
#13 Fernando G. Guerrero
29/10/2003 - 17:23 | Informe spam
quería decir yyyy-mm-dd

Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

"Fernando G. Guerrero" wrote in message
news:%
Cada motor de base de datos lidia con fechas de un modo diferente, así que
si quieres hacer algo realmente general, no vas a tener más remedio que
convertir tus fechas al formato canónigo de ODBC (yyy-mm-dd) en la
aplicación de cliente, antes de enviarlo al motor de base de datos. Este
formato lo admiten la gran mayoría de los motores de bases de datos.

Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

wrote in message
news:0d8d01c39e35$ff503e10$
si, por ahí esto me sirve, pero lo estoy probando desde la
aplicación y me da error. Dónde lo tengo que poner ? Me va
a dar error con cualquier otro motor de base de datos?
porque mi aplicacion es totalmente adaptable a cualquier
motor y no a una sola.

>Se me ha olvidado comentar que utilizando SET DATEFORMAT
desde la aplicación
>de cliente, la inserción se hará siempre correctamente
independientemente
>del idioma que se haya utilizado para instalar SQL Server.
>
>Y el valor 'dmy' lo puedes pasar como variable también.
>
>Por otro lado, si creas tus logins en SQL Server con el
idioma correcto, SQL
>Server es asignará automáticamente el formato de fecha
adecuado a sus
>opciones regionales.
>
>Crea los siguientes logins:
>
>if not exists (select * from master.dbo.syslogins where
loginname > >N'Pedro')
>BEGIN
>declare @logindb nvarchar(132), @loginlang nvarchar(132)
select @logindb > >N'master', @loginlang = N'Español'
>if @logindb is null or not exists (select * from
master.dbo.sysdatabases
>where name = @logindb)
>select @logindb = N'master'
>if @loginlang is null or (not exists (select * from
master.dbo.syslanguages
>where name = @loginlang) and @loginlang <> N'us_english')
>select @loginlang = @@language
>exec sp_addlogin N'Pedro', null, @logindb, @loginlang
>END
>
>GO
>
>if not exists (select * from master.dbo.syslogins where
loginname > >N'Peter')
>BEGIN
>declare @logindb nvarchar(132), @loginlang nvarchar(132)
select @logindb > >N'master', @loginlang = N'us_english'
>if @logindb is null or not exists (select * from
master.dbo.sysdatabases
>where name = @logindb)
>select @logindb = N'master'
>if @loginlang is null or (not exists (select * from
master.dbo.syslanguages
>where name = @loginlang) and @loginlang <> N'us_english')
>select @loginlang = @@language
>exec sp_addlogin N'Peter', null, @logindb, @loginlang
>END
>GO
>
>Ahora conéctate a SQL Server con el login Pedro y ejecuta
el comando: DBCC
>USEROPTIONS
>Ahora conéctate a SQL Server con el login Peter y ejecuta
el comando: DBCC
>USEROPTIONS
>
>Verás que el valor de dateformat es distinto para ambos
logins.
>
>Espero que esto sí te sea de ayuda :-)
>
>
>Fernando G. Guerrero
>SQL Server MVP
>CEO & Principal Mentor
>Solid Quality Learning
>www.solidqualitylearning.com
>
>"Comparte lo que sabes, aprende lo que no sepas"
>
>"Fernando G. Guerrero" wrote in
message
>news:
>> El problema es que al enviar fechas a SQL Server en
modo texto, SQL Server
>> tiene que interpretar de qué fecha se trata y el
formato de texto depende
>de
>> las opciones regionales de la máquina.
>>
>> Sin embargo, puedes utilizar el formato SET DATEFORMAT
para especificar en
>> que orden tu aplicación de cliente envia la fecha:
>>
>> USE Tempdb
>> GO
>>
>> CREATE TABLE MyDate (fecha datetime)
>>
>> GO
>>
>>
>> SET DATEFORMAT dmy
>>
>> INSERT MyDate VALUES ('16/02/1959')
>> GO
>>
>>
>>
>> SET DATEFORMAT mdy
>>
>> INSERT MyDate VALUES ('02/16/1959')
>> GO
>>
>> SELECT *
>> FROM MyDate
>>
>>
>> Fernando G. Guerrero
>> SQL Server MVP
>> CEO & Principal Mentor
>> Solid Quality Learning
>> www.solidqualitylearning.com
>>
>> "Comparte lo que sabes, aprende lo que no sepas"
>>
>> "Virginia" wrote in message
>> news:0f7101c39e2b$d5337ed0$
>> Fernando, muy buena tu explicación, pero no me sirve de
>> mucho, por qué? porque yo tengo una aplicación que debe
>> ser adaptable a cualquier motor, por eso mismo, yo seteo
>> las máscaras desde la aplicacion segun la base de datos,
>> si es como vos decís, para cualquier máscara debería
>> funcionar un insert, y sin embargo me da error, sólo
toma
>> la siguiente máscara: yyyy-dd-mm hh:mm:ss.000, porque el
>> SQL está en inglés, pero para uno en castellano esa
>> máscara no me sirve, o sea, quiero poder manejar y
setear
>> la máscara desde la base de datos, para que tenga la
misma
>> que la aplicacion.
>> En la respuesta a otro mail de Carlos, lo expliqué
mejor.
>>
>> >Es que son las 6 de la mañana en Los Angeles y me ha
>> apetecido escribir un
>> >poso ;-)
>> >
>> >Fernando G. Guerrero
>> >SQL Server MVP
>> >CEO & Principal Mentor
>> >Solid Quality Learning
>> >www.solidqualitylearning.com
>> >
>> >"Comparte lo que sabes, aprende lo que no sepas"
>> >
>> >"Carlos Sacristan" wrote in
message
>> >news:%
>> >>
>> >> :-O
>> >>
>> >> Wow, Fernando. El día que pregunten algo más
>> complejo vas a tener que
>> >> anexar un manual en vez de un simple comentario ;-)
>> >>
>> >> Siempre un placer leerte de nuevo por aquí
>> >>
>> >>
>> >>
>> >> Un saludo
>> >>
>> >> -
>> >> "Sólo sé que no sé nada. " (Sócrates)
>> >> MVP SQL Server
>> >> Por favor, responder únicamente al foro
>> >> Se agradece la inclusión de sentencias DDL
>> >>
>> >>
>> >> "Fernando G. Guerrero"
escribió
>> en el mensaje
>> >> news:
>> >> > SQL Server almacena las fechas siempre en un
formato
>> binario que es
>> >> > independiente del formato de salida que seleccione
el
>> usuario. Este
>> >> formato
>> >> > binario es el conjunto de dos partes, una que
>> representa la fecha
>> >(número
>> >> de
>> >> > días desde la fecha origen) y otra parte representa
>> hora (número de
>> >ticks
>> >> > desde medianoche).
>> >> >
>> >> > Si se trata de un smalldatetime, la parte de fecha
se
>> almacena como el
>> >> > número días que han pasado desde el 1 de Enero de
>> 1900, si se trata de
>> >un
>> >> > campo datetime, este valor sería negativo si se
>> tratara de una fecha
>> >> > anterior al 1 de Enero de 1900.
>> >> >
>> >> > Si se trata de un smalldatetime, la parte de hora
>> almacena el número de
>> >> > minutos que han pasado desde la medianoche,
mientras
>> que si se trata de
>> >un
>> >> > campo datetime, la parte de hora almacenará cuántos
>> trescientosavos de
>> >> > segundo han pasado desde la medianoche.
>> >> >
>> >> > Si quieres ver cómo SQL Server almacena estos
valores
>> binarios, ejecuta
>> >el
>> >> > siguiente script:
>> >> >
>> >> > USE Tempdb
>> >> > GO
>> >> >
>> >> > CREATE TABLE Mifecha (Fecha datetime,
>> >> > Fechita smalldatetime)
>> >> >
>> >> > INSERT MiFecha
>> >> > SELECT Getdate(), GetDate()
>> >> >
>> >> > INSERT MiFecha
>> >> > SELECT '1/1/1800', GetDate()
>> >> >
>> >> > INSERT MiFecha
>> >> > SELECT '1/1/1800 10:15', GetDate()
>> >> >
>> >> > GO
>> >> >
>> >> >
>> >> > SELECT *
>> >> > FROM sysindexes
>> >> > WHERE id = OBJECT_ID('MiFecha')
>> >> >
>> 0x4B0000000100,
>> almacenan los
>> >> >
>> >> > DBCC TRACEON(3604)
>> >> >
>> >> > DBCC PAGE (Tempdb, 1, 75, 3)
>> >> >
>> >> > /* verás que hay tres registros con los valores que
>> has almacenado
>> >> > En mi caso, he obtenido esto:
>> >> >
>> >> > Slot 0 Offset 0x60
>> >> >
>> >> > Record Type = PRIMARY_RECORD
>> >> > Record Attributes = NULL_BITMAP
>> >> > 1A786060: 00100010 00610fa5 00009421
>> 94210161 ..a.!...a.!.
>> >> > 1A786070:
000002 ...
>> >> > Fecha = Oct 29 2003
5:53AM
>> >> > Fechita = Oct 29 2003
5:53AM
>> >> >
>> >> > Slot 1 Offset 0x73
>> >> >
>> >> > Record Type = PRIMARY_RECORD
>> >> > Record Attributes = NULL_BITMAP
>> >> > 1A786073: 00100010 00000000 ffff7154
>> 94210167 Tq..g.!.
>> >> > 1A786083:
000002 ...
>> >> > Fecha = Jan 1 1800
12:00AM
>> >> > Fechita = Oct 29 2003
5:59AM
>> >> >
>> >> > Slot 2 Offset 0x86
>> >> >
>> >> > Record Type = PRIMARY_RECORD
>> >> > Record Attributes = NULL_BITMAP
>> >> > 1A786086: 00100010 00a8ea30 ffff7154
>> 9421016e 0...Tq..n.!.
>> >> > 1A786096:
000002 ...
>> >> > Fecha = Jan 1 1800
10:15AM
>> >> > Fechita = Oct 29 2003
6:06AM
>> >> >
>> >> > Si jugamos un poco con valores hexadecimales,
>> >> >
>> >> > 0x9421 = 37921 dias
>> >> >
>> >> > */
>> >> >
>> >> > SELECT DATEADD(day, 37921, '1/1/1900')
>> >> >
>> >> >
>> 256*256*256*256)
>> >> >
>> >> > SELECT DATEADD(day, -36524, '1/1/1900')
>> >> >
>> >> >
>> ejecut;e el script)
>> minutos = 10:15
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > Fernando G. Guerrero
>> >> > SQL Server MVP
>> >> > CEO & Principal Mentor
>> >> > Solid Quality Learning
>> >> > www.solidqualitylearning.com
>> >> >
>> >> > "Comparte lo que sabes, aprende lo que no sepas"
>> >> >
>> >> > "Virginia" wrote in message
>> >> > news:04f301c39e21$004272d0$
>> >> > Hola a todos, no sé si es posible, en ese caso, si
>> alguien
>> >> > me puede ayudar a resolver mi problema: necesito
>> modificar
>> >> > el formato de las fechas en una base de datos y no

>> cómo
>> >> > se hace, busqué y no encontré nada.
>> >> > En el caso de que se pueda, es a nivel base de
datos
>> o a
>> >> > nivel del SQL Server (o sea, todas las bases que
cree
>> >> > quedarían con la misma configuración)?
>> >> > Muchas gracias
>> >> >
>> >> >
>> >>
>> >>
>> >
>> >
>> >.
>> >
>>
>>
>
>
>.
>


Respuesta Responder a este mensaje
#14 Virginia
29/10/2003 - 18:20 | Informe spam
Bueno, muchas gracias. Voy a intentar.

Cada motor de base de datos lidia con fechas de un modo


diferente, así que
si quieres hacer algo realmente general, no vas a tener


más remedio que
convertir tus fechas al formato canónigo de ODBC (yyy-mm-


dd) en la
aplicación de cliente, antes de enviarlo al motor de base


de datos. Este
formato lo admiten la gran mayoría de los motores de


bases de datos.

Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

wrote in message
news:0d8d01c39e35$ff503e10$
si, por ahí esto me sirve, pero lo estoy probando desde la
aplicación y me da error. Dónde lo tengo que poner ? Me va
a dar error con cualquier otro motor de base de datos?
porque mi aplicacion es totalmente adaptable a cualquier
motor y no a una sola.

Se me ha olvidado comentar que utilizando SET DATEFORMAT


desde la aplicación
de cliente, la inserción se hará siempre correctamente


independientemente
del idioma que se haya utilizado para instalar SQL




Server.

Y el valor 'dmy' lo puedes pasar como variable también.

Por otro lado, si creas tus logins en SQL Server con el


idioma correcto, SQL
Server es asignará automáticamente el formato de fecha


adecuado a sus
opciones regionales.

Crea los siguientes logins:

if not exists (select * from master.dbo.syslogins where


loginname >>N'Pedro')
BEGIN
declare @logindb nvarchar(132), @loginlang nvarchar(132)


select @logindb >>N'master', @loginlang = N'Español'
if @logindb is null or not exists (select * from


master.dbo.sysdatabases
where name = @logindb)
select @logindb = N'master'
if @loginlang is null or (not exists (select * from


master.dbo.syslanguages
where name = @loginlang) and @loginlang <> N'us_english')
select @loginlang = @@language
exec sp_addlogin N'Pedro', null, @logindb, @loginlang
END

GO

if not exists (select * from master.dbo.syslogins where


loginname >>N'Peter')
BEGIN
declare @logindb nvarchar(132), @loginlang nvarchar(132)


select @logindb >>N'master', @loginlang = N'us_english'
if @logindb is null or not exists (select * from


master.dbo.sysdatabases
where name = @logindb)
select @logindb = N'master'
if @loginlang is null or (not exists (select * from


master.dbo.syslanguages
where name = @loginlang) and @loginlang <> N'us_english')
select @loginlang = @@language
exec sp_addlogin N'Peter', null, @logindb, @loginlang
END
GO

Ahora conéctate a SQL Server con el login Pedro y ejecuta


el comando: DBCC
USEROPTIONS
Ahora conéctate a SQL Server con el login Peter y ejecuta


el comando: DBCC
USEROPTIONS

Verás que el valor de dateformat es distinto para ambos


logins.

Espero que esto sí te sea de ayuda :-)


Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

"Fernando G. Guerrero" wrote in


message
news:
El problema es que al enviar fechas a SQL Server en




modo texto, SQL Server
tiene que interpretar de qué fecha se trata y el




formato de texto depende
de
las opciones regionales de la máquina.

Sin embargo, puedes utilizar el formato SET DATEFORMAT




para especificar en
que orden tu aplicación de cliente envia la fecha:

USE Tempdb
GO

CREATE TABLE MyDate (fecha datetime)

GO


SET DATEFORMAT dmy

INSERT MyDate VALUES ('16/02/1959')
GO



SET DATEFORMAT mdy

INSERT MyDate VALUES ('02/16/1959')
GO

SELECT *
FROM MyDate


Fernando G. Guerrero
SQL Server MVP
CEO & Principal Mentor
Solid Quality Learning
www.solidqualitylearning.com

"Comparte lo que sabes, aprende lo que no sepas"

"Virginia" wrote in message
news:0f7101c39e2b$d5337ed0$
Fernando, muy buena tu explicación, pero no me sirve de
mucho, por qué? porque yo tengo una aplicación que debe
ser adaptable a cualquier motor, por eso mismo, yo






seteo
las máscaras desde la aplicacion segun la base de






datos,
si es como vos decís, para cualquier máscara debería
funcionar un insert, y sin embargo me da error, sólo




toma
la siguiente máscara: yyyy-dd-mm hh:mm:ss.000, porque






el
SQL está en inglés, pero para uno en castellano esa
máscara no me sirve, o sea, quiero poder manejar y




setear
la máscara desde la base de datos, para que tenga la




misma
que la aplicacion.
En la respuesta a otro mail de Carlos, lo expliqué




mejor.

>Es que son las 6 de la mañana en Los Angeles y me ha
apetecido escribir un
>poso ;-)
>
>Fernando G. Guerrero
>SQL Server MVP
>CEO & Principal Mentor
>Solid Quality Learning
>www.solidqualitylearning.com
>
>"Comparte lo que sabes, aprende lo que no sepas"
>
>"Carlos Sacristan" wrote in




message
>news:%
>>
>> :-O
>>
>> Wow, Fernando. El día que pregunten algo más
complejo vas a tener que
>> anexar un manual en vez de un simple comentario ;-






)
>>
>> Siempre un placer leerte de nuevo por aquí
>>
>>
>>
>> Un saludo
>>
>> -
>> "Sólo sé que no sé nada. " (Sócrates)
>> MVP SQL Server
>> Por favor, responder únicamente al foro
>> Se agradece la inclusión de sentencias DDL
>>
>>
>> "Fernando G. Guerrero"




escribió
en el mensaje
>> news:
>> > SQL Server almacena las fechas siempre en un




formato
binario que es
>> > independiente del formato de salida que seleccione




el
usuario. Este
>> formato
>> > binario es el conjunto de dos partes, una que
representa la fecha
>(número
>> de
>> > días desde la fecha origen) y otra parte






representa
hora (número de
>ticks
>> > desde medianoche).
>> >
>> > Si se trata de un smalldatetime, la parte de fecha




se
almacena como el
>> > número días que han pasado desde el 1 de Enero de
1900, si se trata de
>un
>> > campo datetime, este valor sería negativo si se
tratara de una fecha
>> > anterior al 1 de Enero de 1900.
>> >
>> > Si se trata de un smalldatetime, la parte de hora
almacena el número de
>> > minutos que han pasado desde la medianoche,




mientras
que si se trata de
>un
>> > campo datetime, la parte de hora almacenará






cuántos
trescientosavos de
>> > segundo han pasado desde la medianoche.
>> >
>> > Si quieres ver cómo SQL Server almacena estos




valores
binarios, ejecuta
>el
>> > siguiente script:
>> >
>> > USE Tempdb
>> > GO
>> >
>> > CREATE TABLE Mifecha (Fecha datetime,
>> > Fechita smalldatetime)
>> >
>> > INSERT MiFecha
>> > SELECT Getdate(), GetDate()
>> >
>> > INSERT MiFecha
>> > SELECT '1/1/1800', GetDate()
>> >
>> > INSERT MiFecha
>> > SELECT '1/1/1800 10:15', GetDate()
>> >
>> > GO
>> >
>> >
>> > SELECT *
>> > FROM sysindexes
>> > WHERE id = OBJECT_ID('MiFecha')
>> >
0x4B0000000100,
almacenan los
>> >
>> > DBCC TRACEON(3604)
>> >
>> > DBCC PAGE (Tempdb, 1, 75, 3)
>> >
>> > /* verás que hay tres registros con los valores






que
has almacenado
>> > En mi caso, he obtenido esto:
>> >
>> > Slot 0 Offset 0x60
>> >
>> > Record Type = PRIMARY_RECORD
>> > Record Attributes = NULL_BITMAP
>> > 1A786060: 00100010 00610fa5 00009421
94210161 ..a.!...a.!.
>> > 1A786070:




000002 ...
>> > Fecha = Oct 29 2003




5:53AM
>> > Fechita = Oct 29 2003




5:53AM
>> >
>> > Slot 1 Offset 0x73
>> >
>> > Record Type = PRIMARY_RECORD
>> > Record Attributes = NULL_BITMAP
>> > 1A786073: 00100010 00000000 ffff7154
94210167 Tq..g.!.
>> > 1A786083:




000002 ...
>> > Fecha = Jan 1 1800




12:00AM
>> > Fechita = Oct 29 2003




5:59AM
>> >
>> > Slot 2 Offset 0x86
>> >
>> > Record Type = PRIMARY_RECORD
>> > Record Attributes = NULL_BITMAP
>> > 1A786086: 00100010 00a8ea30 ffff7154
9421016e 0...Tq..n.!.
>> > 1A786096:




000002 ...
>> > Fecha = Jan 1 1800




10:15AM
>> > Fechita = Oct 29 2003




6:06AM
>> >
>> > Si jugamos un poco con valores hexadecimales,
>> >
>> > 0x9421 = 37921 dias
>> >
>> > */
>> >
>> > SELECT DATEADD(day, 37921, '1/1/1900')
>> >
>> >






restamos
256*256*256*256)
>> >
>> > SELECT DATEADD(day, -36524, '1/1/1900')
>> >
>> >
ejecut;e el script)
minutos = 10:15
>> >
>> >
>> >
>> >
>> >
>> > Fernando G. Guerrero
>> > SQL Server MVP
>> > CEO & Principal Mentor
>> > Solid Quality Learning
>> > www.solidqualitylearning.com
>> >
>> > "Comparte lo que sabes, aprende lo que no sepas"
>> >
>> > "Virginia" wrote in






message
>> > news:04f301c39e21$004272d0$
>> > Hola a todos, no sé si es posible, en ese caso, si
alguien
>> > me puede ayudar a resolver mi problema: necesito
modificar
>> > el formato de las fechas en una base de datos y no





cómo
>> > se hace, busqué y no encontré nada.
>> > En el caso de que se pueda, es a nivel base de




datos
o a
>> > nivel del SQL Server (o sea, todas las bases que




cree
>> > quedarían con la misma configuración)?
>> > Muchas gracias
>> >
>> >
>>
>>
>
>
>.
>






.





.

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