Discussion:
Actualizar filas de una tabla con hora aleatoria.
(demasiado antiguo para responder)
Salvador Ramos
2007-01-10 09:27:21 UTC
Permalink
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)
------------------------------------------------
Carlos Sacristan
2007-01-10 10:31:46 UTC
Permalink
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...
Post by Salvador Ramos
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.
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
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
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)
------------------------------------------------
Salvador Ramos
2007-01-10 10:54:59 UTC
Permalink
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
-- update tmpGasoleoProf01
-- set Hora = ...
-- where current of CurHora
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)
------------------------------------------------
Post by Carlos Sacristan
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...
Post by Salvador Ramos
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.
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
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
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)
------------------------------------------------
Salvador Ramos
2007-01-10 11:04:36 UTC
Permalink
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)
------------------------------------------------
Post by Salvador Ramos
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
declare CurHora cursor local forward_only
for select PK, hora
from tmpGasoleoProf01
where hora = ''
open CurHora
-- update tmpGasoleoProf01
-- set Hora = ...
-- where current of CurHora
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)
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)
------------------------------------------------
Post by Carlos Sacristan
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...
Post by Salvador Ramos
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.
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
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
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)
------------------------------------------------
Rubén Vigón
2007-01-10 11:41:46 UTC
Permalink
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
Salvador Ramos
2007-01-10 19:12:34 UTC
Permalink
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" <***@ESTOmvps.org> escribi� en el mensaje news:***@TK2MSFTNGP02.phx.gbl...
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
Loading...