Actualizar filas de una tabla con hora aleatoria.

10/01/2007 - 10:27 por Salvador Ramos | Informe spam
Hola a todos,

Por un error en una aplicación, se han generado una serie de filas con una
columna hora (char(4)) con el valor '', ahora necesito actualizar esas filas
con una hora generada de forma aleatoria. Y ahí es donde tengo el problema,
ya que no consigo generar estos valores.

En primer lugar he intentado lo siguiente:
select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) *
100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2) as aleatorio,*
from MiTabla
where hora = ''

El problema es que me genera un solo valor aleatorio para toda la
instrucción select. Luego he decidido hacer una función que devuelva una
hora aleatoria:
create function dbo.HoraAleatoria()
returns char(4)
as
begin
return( select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE())
* 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2)
)
end
GO

Pero me indica que el siguiente error:
Uso no válido de operador con efectos secundarios o dependiente del tiempo
en 'rand' dentro de una función.

Además si ejecuto la función muy seguido me da horas muy similares o
idénticas.

Alguien me puede ayudar a generar estas horas de forma aleatoria para cada
una de las filas ?

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
10/01/2007 - 11:31 | Informe spam
Pues mira, a riesgo de que la brigada anti-cursores venga a por mí, creo
que la mejor solución en tu caso sería usando uno (un cursor, ya sea
declarado explícitamente o mediante un WHILE) y entonces ir actualizando uno
a uno esos registros calculando previamente la fecha que le quieres asignar.
Total, es algo que no lo vas a hacer todos los días, no?

La fórmula para generar esa fecha aleatoria ya la dejo a tu
imaginación...

"Salvador Ramos" escribió en el
mensaje news:
Hola a todos,

Por un error en una aplicación, se han generado una serie de filas con una
columna hora (char(4)) con el valor '', ahora necesito actualizar esas
filas con una hora generada de forma aleatoria. Y ahí es donde tengo el
problema, ya que no consigo generar estos valores.

En primer lugar he intentado lo siguiente:
select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) *
100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2) as aleatorio,*
from MiTabla
where hora = ''

El problema es que me genera un solo valor aleatorio para toda la
instrucción select. Luego he decidido hacer una función que devuelva una
hora aleatoria:
create function dbo.HoraAleatoria()
returns char(4)
as
begin
return( select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm,
GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2)
)
end
GO

Pero me indica que el siguiente error:
Uso no válido de operador con efectos secundarios o dependiente del tiempo
en 'rand' dentro de una función.

Además si ejecuto la función muy seguido me da horas muy similares o
idénticas.

Alguien me puede ayudar a generar estas horas de forma aleatoria para cada
una de las filas ?

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)



Respuesta Responder a este mensaje
#2 Salvador Ramos
10/01/2007 - 11:54 | Informe spam
Llevas razón, es algo puntual y para unas 500 filas, tampoco me importa usar
cursores.

Ahora si que me gustaría que me echaseis una mano en la fórmula para
conseguir los valores aleatorios que os he mostrado, por la rapidez con la
que se ejecuta la instrucción me devuelve la misma hora para todas las
filas.

Esta es la solución que he montado, está pendiente de realizar el update en
lugar del print:
declare @PK char(75), @Hora char(4)
declare CurHora cursor local forward_only
for select PK, hora
from tmpGasoleoProf01
where hora = ''
open CurHora
fetch next from CurHora into @PK, @Hora
while @@fetch_status = 0 begin
print @PK
print right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) *
100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2)
fetch next from CurHora into @PK, @Hora
end
close CurHora
deallocate CurHora

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Carlos Sacristan" <nomail> escribió en el mensaje
news:%

Pues mira, a riesgo de que la brigada anti-cursores venga a por mí,
creo que la mejor solución en tu caso sería usando uno (un cursor, ya sea
declarado explícitamente o mediante un WHILE) y entonces ir actualizando
uno a uno esos registros calculando previamente la fecha que le quieres
asignar. Total, es algo que no lo vas a hacer todos los días, no?

La fórmula para generar esa fecha aleatoria ya la dejo a tu
imaginación...

"Salvador Ramos" escribió en el
mensaje news:
Hola a todos,

Por un error en una aplicación, se han generado una serie de filas con
una columna hora (char(4)) con el valor '', ahora necesito actualizar
esas filas con una hora generada de forma aleatoria. Y ahí es donde tengo
el problema, ya que no consigo generar estos valores.

En primer lugar he intentado lo siguiente:
select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) *
100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2) as aleatorio,*
from MiTabla
where hora = ''

El problema es que me genera un solo valor aleatorio para toda la
instrucción select. Luego he decidido hacer una función que devuelva una
hora aleatoria:
create function dbo.HoraAleatoria()
returns char(4)
as
begin
return( select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm,
GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2)
)
end
GO

Pero me indica que el siguiente error:
Uso no válido de operador con efectos secundarios o dependiente del
tiempo en 'rand' dentro de una función.

Además si ejecuto la función muy seguido me da horas muy similares o
idénticas.

Alguien me puede ayudar a generar estas horas de forma aleatoria para
cada una de las filas ?

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)







Respuesta Responder a este mensaje
#3 Salvador Ramos
10/01/2007 - 12:04 | Informe spam
Ya está solucionado, era aun más sencillo, estaba un poco obcecado :-)

Esta es la update que utilizo sobre el cursor anterior, y va bien:
update tmpGasoleoProf01
set Hora = right(rtrim('00' + cast(cast( RAND() * 24 as int) as char(2))),
2) +
right(rtrim('00' + cast(cast( RAND() * 60 as int) as char(2))), 2)
where current of CurHora

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Salvador Ramos" escribió en el
mensaje news:
Llevas razón, es algo puntual y para unas 500 filas, tampoco me importa
usar cursores.

Ahora si que me gustaría que me echaseis una mano en la fórmula para
conseguir los valores aleatorios que os he mostrado, por la rapidez con la
que se ejecuta la instrucción me devuelve la misma hora para todas las
filas.

Esta es la solución que he montado, está pendiente de realizar el update
en lugar del print:
declare @PK char(75), @Hora char(4)
declare CurHora cursor local forward_only
for select PK, hora
from tmpGasoleoProf01
where hora = ''
open CurHora
fetch next from CurHora into @PK, @Hora
while @@fetch_status = 0 begin
print @PK
print right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) *
100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2)
fetch next from CurHora into @PK, @Hora
end
close CurHora
deallocate CurHora

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Carlos Sacristan" <nomail> escribió en el mensaje
news:%

Pues mira, a riesgo de que la brigada anti-cursores venga a por mí,
creo que la mejor solución en tu caso sería usando uno (un cursor, ya sea
declarado explícitamente o mediante un WHILE) y entonces ir actualizando
uno a uno esos registros calculando previamente la fecha que le quieres
asignar. Total, es algo que no lo vas a hacer todos los días, no?

La fórmula para generar esa fecha aleatoria ya la dejo a tu
imaginación...

"Salvador Ramos" escribió en el
mensaje news:
Hola a todos,

Por un error en una aplicación, se han generado una serie de filas con
una columna hora (char(4)) con el valor '', ahora necesito actualizar
esas filas con una hora generada de forma aleatoria. Y ahí es donde
tengo el problema, ya que no consigo generar estos valores.

En primer lugar he intentado lo siguiente:
select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) *
100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2) as aleatorio,*
from MiTabla
where hora = ''

El problema es que me genera un solo valor aleatorio para toda la
instrucción select. Luego he decidido hacer una función que devuelva una
hora aleatoria:
create function dbo.HoraAleatoria()
returns char(4)
as
begin
return( select right(rtrim('00' + cast(cast( RAND( (DATEPART(mm,
GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 24 as int) as char(2))), 2) +
right(rtrim('00' + cast(cast( RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) ) * 60 as int) as char(2))), 2)
)
end
GO

Pero me indica que el siguiente error:
Uso no válido de operador con efectos secundarios o dependiente del
tiempo en 'rand' dentro de una función.

Además si ejecuto la función muy seguido me da horas muy similares o
idénticas.

Alguien me puede ayudar a generar estas horas de forma aleatoria para
cada una de las filas ?

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)











Respuesta Responder a este mensaje
#4 Rubén Vigón
10/01/2007 - 12:41 | Informe spam
Hola Salva!

Precisamente hace unos días tuve que hacer algo muy parecido: RAND no nos sirve (ya que genera el mismo valor aleatorio para todas las filas), pero NewId() sí; por ejemplo:

DECLARE @prueba TABLE(Fecha datetime)
INSERT INTO @prueba (Fecha) VALUES (GetDate())
INSERT INTO @prueba (Fecha) VALUES (GetDate())
INSERT INTO @prueba (Fecha) VALUES (GetDate())
SELECT
Fecha,
DATEADD(ms, CAST(CAST(NewId() AS varbinary(8)) AS int), Fecha) AS FechaAleatoria
FROM
@prueba

Fecha FechaAleatoria
2007-01-10 12:45:44.623 2007-01-23 08:58:25.020
2007-01-10 12:45:44.623 2007-01-04 18:50:18.867
2007-01-10 12:45:44.623 2007-01-16 00:11:52.307

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
http://vigon.mvps.org
Respuesta Responder a este mensaje
#5 Salvador Ramos
10/01/2007 - 20:12 | Informe spam
Gracias Rubén,

La brigada anticursores también te lo agradecerá ;-)

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Rubén Vigón" escribió en el mensaje
news:
Hola Salva!

Precisamente hace unos días tuve que hacer algo muy parecido: RAND no
nos sirve (ya que genera el mismo valor aleatorio para todas las filas),
pero NewId() sí; por ejemplo:

DECLARE @prueba TABLE(Fecha datetime)
INSERT INTO @prueba (Fecha) VALUES (GetDate())
INSERT INTO @prueba (Fecha) VALUES (GetDate())
INSERT INTO @prueba (Fecha) VALUES (GetDate())
SELECT
Fecha,
DATEADD(ms, CAST(CAST(NewId() AS varbinary(8)) AS int), Fecha) AS
FechaAleatoria
FROM
@prueba

Fecha FechaAleatoria
2007-01-10 12:45:44.623 2007-01-23 08:58:25.020
2007-01-10 12:45:44.623 2007-01-04 18:50:18.867
2007-01-10 12:45:44.623 2007-01-16 00:11:52.307

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
http://vigon.mvps.org
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida