Retornando um registro aleatório em MS SQL Server
Vamos explicar agora com dados. Nossa tabela empresas tem 3680 registros. Vamos retornar apenas 1 registro ALEATÓRIO entre esses todos. Vamos supor que a função tenha retornado 0.568 e o ID máximo de nossa tabela seja mesmo o id_empresa número 3680.
0.568 * 3680 = 2090.24
Perfeito!!!!
A instrução irá nos retornar os registros após o ID 2090. E como colocamos o TOP 1, apenas 1 registro nos é retornado.
Bem pessoal, apesar de essa lógica resolver nosso problema ela ainda tem um detalhe FUNDAMENTAL. No nosso caso temos o nosso id_empresa como Identity. Com Identity Increment 1. O que significa que ele será incrementado de UM em UM.
Vamos supor que essa mesma tabela com o ID máximo de 3680 tenha um "buraco" de 2600 registros entre o ID 1080 e último 3680. Então qualquer número aleatório gerado pela função RAND() que estiver contido nesse intervalo levando em consideração o seu produto pelo máximo ID sempre nos acarretará o retorno desse máximo ID.
Observamos que para casos onde existam muita manipulação de registros de forma que se apresente essa característica, essa lógica perde a eficiência. Entretanto, para tabelas onde os IDs permaneçam quase que inalterados ela é perfeita e só dependerá da função RAND().
Bem pessoal é isso aí....
Recife – PE
Olavo Alexandrino
0.568 * 3680 = 2090.24
SELECT TOP 1 FROM empresas WHERE id_empresa >= 2090.24
Perfeito!!!!
A instrução irá nos retornar os registros após o ID 2090. E como colocamos o TOP 1, apenas 1 registro nos é retornado.
Bem pessoal, apesar de essa lógica resolver nosso problema ela ainda tem um detalhe FUNDAMENTAL. No nosso caso temos o nosso id_empresa como Identity. Com Identity Increment 1. O que significa que ele será incrementado de UM em UM.
Vamos supor que essa mesma tabela com o ID máximo de 3680 tenha um "buraco" de 2600 registros entre o ID 1080 e último 3680. Então qualquer número aleatório gerado pela função RAND() que estiver contido nesse intervalo levando em consideração o seu produto pelo máximo ID sempre nos acarretará o retorno desse máximo ID.
Observamos que para casos onde existam muita manipulação de registros de forma que se apresente essa característica, essa lógica perde a eficiência. Entretanto, para tabelas onde os IDs permaneçam quase que inalterados ela é perfeita e só dependerá da função RAND().
Bem pessoal é isso aí....
Recife – PE
Olavo Alexandrino
Campo utilizado: datetime
O Parâmetro 8, retorna a hora da função GETDATE(), caso não funcione, deve retornar a String da hora do campo datetime para comparar pelo valor retornado pela função GETDATE.
O Parâmetro 8, retorna a hora da função GETDATE(), caso não funcione, deve retornar a String da hora do campo datetime para comparar pelo valor retornado pela função GETDATE.
26/06/2003 7:24am
(~21 anos atrás)
Bem Wellington, não sei se vai dá certo, mas tente o seguinte:
SELECT * FROM datas WHERE (TimeIn>=CONVERT(CHAR,GETDATE(),8) AND TimeOut<=CONVERT(CHAR,GETDATE(),8))
PS: m SQL SERVER o parâmetro 8 passado como pela função CONVERT retorna a hora de um campo "datetime"
Tente isso aí!!
SELECT * FROM datas WHERE (TimeIn>=CONVERT(CHAR,GETDATE(),8) AND TimeOut<=CONVERT(CHAR,GETDATE(),8))
PS: m SQL SERVER o parâmetro 8 passado como pela função CONVERT retorna a hora de um campo "datetime"
Tente isso aí!!
26/06/2003 7:20am
(~21 anos atrás)
Putz, bem que tu poderia me ajudar em uma pequena coisa... tipow, estou tentando a dias descobrir uma forma de fazer um script de pré definição ussando MySQL + ASP mas vamos la... SQL é tudo a mesma coisa então acho que você pode me esclarecer algumas coisas...
Eu precisso que um determinado resultado seja exibido ao usuário conforme a hora local do servidor...
Tipow tenho 2 rows TimeIn - TimeOut
na TimeIn tenho 14:00 e na TimeOut tenho 15:00 horas
então c forme 14:42 ele mostra o resultado que tem entre 14:00 e 15:00.
Eu precisso que um determinado resultado seja exibido ao usuário conforme a hora local do servidor...
Tipow tenho 2 rows TimeIn - TimeOut
na TimeIn tenho 14:00 e na TimeOut tenho 15:00 horas
então c forme 14:42 ele mostra o resultado que tem entre 14:00 e 15:00.
23/06/2003 8:09pm
(~21 anos atrás)
Perfeito Diego,
bem quando precisei utilizar isso não sabia dessa função, como ficou legal e funcionou resolvi publicar!!
Devia até ter mencionado no artigo pois ainda tem outra particularidade.
A forma que fiz é eficiente apenas para UM ÚNICO registro, pois de por exemplo fizermos:
SELECT TOP 10 * FROM empresas WHERE id_empresa >= (RAND() * (SELECT MAX(id_empresa) FROM empresa))
e se o parâmetro retornado for 89, por exemplo, serão retornado, em SEQUÊNCIA, os próximos 10 a partir de 89.
Ou seja, o único registro aleatório foi o 89, os demais seguiram a sequência.
Caso fizermos:
SELECT TOP 10 * FROM empresas ORDER BY NEWID()
realmente teremos 10 aleatórios, pois para cada registro, é gerado um valor aleatório diferente.
Bem, acho que agora ficou completo!!!
Valeu!!
bem quando precisei utilizar isso não sabia dessa função, como ficou legal e funcionou resolvi publicar!!
Devia até ter mencionado no artigo pois ainda tem outra particularidade.
A forma que fiz é eficiente apenas para UM ÚNICO registro, pois de por exemplo fizermos:
SELECT TOP 10 * FROM empresas WHERE id_empresa >= (RAND() * (SELECT MAX(id_empresa) FROM empresa))
e se o parâmetro retornado for 89, por exemplo, serão retornado, em SEQUÊNCIA, os próximos 10 a partir de 89.
Ou seja, o único registro aleatório foi o 89, os demais seguiram a sequência.
Caso fizermos:
SELECT TOP 10 * FROM empresas ORDER BY NEWID()
realmente teremos 10 aleatórios, pois para cada registro, é gerado um valor aleatório diferente.
Bem, acho que agora ficou completo!!!
Valeu!!
12/06/2003 12:19pm
(~21 anos atrás)
Olavo, outra forma para retornar um registro aleatório do SQL Server seria utilizando a função "NEWID()", no exemplo utilizado por vc poderia ser utilizado da seguinte forma: SELECT TOP 1 * FROM empresas ORDER BY NEWID().
[]'s Diego Vulerio.
[]'s Diego Vulerio.
12/06/2003 7:56am
(~21 anos atrás)
No Mysql
select * from tabela order by rand()
No SQL SERVER
select * from tabela order by newid()
No PostGreSQL
Select * from tabela order by random()
No Oracle
Select coluna from (select coluna from tabela order by dbms_random.value) where rownum = 1
Valeu