Страницы

16 июня 2012 г.

pgScript. Генераторы случайных последовательностей. Дата и время

       Приветствую Вас с своем скромном блоге.
       Сегодня мне хотелось бы продолжить ряд статей (который дополняется медленно, но верно :) ) посвященных генерации случайных последовательностей в pgScript. Далее пойдет речь о последовательностях типа Data, Time и Timestamp. 
Итак, начнем... Синтаксис определения генераторов всех выше указанных типов идентичен:
DATE(min, max, [sequence], [seed])
TIME(min, max, [sequence], [seed])
DATETIME(min, max, [sequence], [seed]) 
где,
min - Минимальная граница диапазона генерации значений;
max - Максимальная граница диапазона генерации значений;
[sequence] - необязательный параметр, устанавливает способ генерации. Различает только нулевое и ненулевое значение. 
[seed] - необязательный параметр, указывает функции номер значения в последовательности которое должна вернуть функция. Это целесообразно использовать в случаях когда необходимо генерировать одинаковое значение при нескольких обращениях к одному генератору, иначе (по умолчанию) при каждом обращении будет генерироваться произвольное значение.

       Простой пример использования (без необязательных параметров):

declare @Rec1;
declare @Rec2;
declare @Rec3;
begin
     set @Rec1 = DATE('2012-01-01', '2012-01-30');
     print @Rec1;
     set @Rec2 = TIME ('09:00:00','13:00:00');
     print @Rec2;
     set @Rec3 = DATETIME ('2012-01-01 00:00:00', '2012-06-15 00:00:00');
     print @Rec3;
end
Результат:
[PGSCRIPT ] 2012-01-19
[PGSCRIPT ] 11:24:29
[PGSCRIPT ] 2012-04-09 22:15:32

       При повторном выполнении скрипта возвращаемые генератором значения изменятся, это означает, что при каждом обращении генератор возвращает новое значение отличное от предыдущего.

       Пример использования с необязательным параметром [sequence]:
[sequence]  = 0:

declare @Rec1;
declare @Rec2;
begin
     set @Rec1 = DATE('2012-01-01', '2012-01-30',0);
     print @Rec1;
     set @Rec2 = DATE('2012-01-01', '2012-01-30',0);
     print @Rec2;
end

Результат:
[PGSCRIPT ] 2012-01-25
[PGSCRIPT ] 2012-01-25

       Здесь мы используем два генератора с абсолютно идентичными параметрами. При всех единовременных обращениях к этим генераторам их значения будут совпадать.
Далее рассмотрим пример с параметром [sequence]  = 1 у второго генератора:

declare @Rec1;
declare @Rec2;
begin
     set @Rec1 = DATE('2012-01-01', '2012-01-30',0);
     print @Rec1;
     set @Rec2 = DATE('2012-01-01', '2012-01-30',1);
     print @Rec2;
end

Результат:
[PGSCRIPT ] 2012-01-18
[PGSCRIPT ] 2012-01-20

       Измененное значение параметра [sequence] инициирует другой алгоритм генерации значений.  При использовании этих двух генераторов совпадение выходных значений возможно, но это будет просто случайное совпадение, вероятность которого напрямую зависит от величины диапазона генерируемых значений. 

       Пример с использованием параметра [seed]:

declare @Rec1;
declare @Rec2;
declare @Rec3;
declare @Rec4;
begin
     set @Rec1 = DATE('2012-01-01', '2012-01-30',0,1);
     print @Rec1;
     set @Rec2 = DATE('2012-01-01', '2012-01-30',0,1);
     print @Rec2;
     set @Rec3 = DATE('2012-01-01', '2012-01-30',0,2);
     print @Rec3;
     set @Rec4 = DATE('2012-01-01', '2012-01-30',0,2);
     print @Rec4;
end

Результат:
[PGSCRIPT ] 2012-01-12
[PGSCRIPT ] 2012-01-12
[PGSCRIPT ] 2012-01-24
[PGSCRIPT ] 2012-01-24

       Разница между @Rec1-@Rec2 и @Rec3-@Rec4 только в последнем параметре ([seed]).
Значения приведенные в результате остаются неизменными при повторном выполнении скрипта. Это означает что каждый генератор будет всегда возвращать одно и тоже значение, номер которого указан в параметре [seed].

Комментариев нет:

Отправить комментарий