2010-12-28 17 views

Odpowiedz

58

Można uzyskać liczbę losową z tego wyrażenia:

Aby otrzymać liczbę losową R w zakresie i < = R < j, użyć wyrażenia FLOOR(i + RAND() * (j - i)). Dla przykład, aby uzyskać liczbę losową w RANGĘ zakres 7 < = R < 12, to może wykorzystać następujące stwierdzenie:

SELECT FLOOR(7 + (RAND() * 5)); 

http://dev.mysql.com/doc/refman/5.1/en/mathematical-functions.html

używa ich do generowania losowego liczbę dni, godzin lub minut (w zależności od rozdzielczości) i dodaj ten numer do bieżącej daty. Pełne wyrażenie byłoby coś takiego:

SELECT NOW() - INTERVAL FLOOR(RAND() * 14) DAY; 
+0

To jest naprawdę stara odpowiedź i naprawdę stare pytanie, ale rozwiązało to problem, w którym musiałem wprowadzić ponad 300 losowych dat. Dziękuję Ci! –

+0

@IsmaelMiguel, Jest to bardzo pośredni sposób robienia tego. Użyj znaczników czasu http://stackoverflow.com/a/28944156/632951, jest bardziej prosty i mniej podatny na błędy. – Pacerier

+1

@Pacerier - Obie metody wyglądają dobrze dla mnie (i bardzo podobne). Jakie potencjalne błędy masz na myśli? –

6

Twoim głównym problemem jest to, że nie pozwala RAND() zakres wartości jak można określić. Zawsze zwróci wartość z przedziału od 0 do 1.

Nie mogę teraz opracować rozwiązania losowego 1..14, ale aby rozpocząć, zostanie wybrana losowa data z ostatnich 10 dni:

SET col = DATE(DATE_SUB(NOW(), INTERVAL ROUND(RAND(1)*10) DAY)) 
11
UPDATE mytable 
SET col = CURRENT_TIMESTAMP - INTERVAL FLOOR(RAND() * 14) DAY 

ustawia col do daty pomiędzy (włącznie) aktualna data i aktualna data - 13 dni. Pomnóż przez 15, aby uzyskać aktualną datę - 14 dni.