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

#6 Virginia
29/10/2003 - 15:49 | Informe spam
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 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
>
>






.

Respuesta Responder a este mensaje
#7 Fernando G. Guerrero
29/10/2003 - 16:25 | Informe spam
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 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
>
>






.

Respuesta Responder a este mensaje
#8 Norman A. Armas
29/10/2003 - 16:38 | Informe spam
Lo unico que se me ocurre es que guardes los datos en un campo tipo real,
esto te daria la flexibilidad que quieres.
Pero para eso tienes que trabajar mas ya que siempre tendrias que convertir
la fecha a real antes de guardarla y viceversa al leerla para mostrarla.


saludos


Norman



"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 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
Respuesta Responder a este mensaje
#9 Fernando G. Guerrero
29/10/2003 - 16:42 | Informe spam
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 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
>> >
>> >
>>
>>
>
>
>.
>


Respuesta Responder a este mensaje
#10 Norman A. Armas
29/10/2003 - 16:48 | Informe spam
Cuando te digo real es por decirte un tipo de dato , depende de la precision
de la fecha que quieras guardar el tipo de dato a usar



"Norman A. Armas" wrote in message
news:
Lo unico que se me ocurre es que guardes los datos en un campo tipo real,
esto te daria la flexibilidad que quieres.
Pero para eso tienes que trabajar mas ya que siempre tendrias que


convertir
la fecha a real antes de guardarla y viceversa al leerla para mostrarla.


saludos


Norman



"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 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


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida