Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Серега MS SQL
Member

Откуда: Сибирь
Сообщений: 23
т.е. есть дата начала интервала времени и дата окончания интервала времени. нужно сгенерировать дату, ограниченную этим интервалом времени, на T-SQL. желательно пример для datetime (не для date).
7 окт 13, 11:36    [14932806]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Серега MS SQL
т.е. есть дата начала интервала времени и дата окончания интервала времени. нужно сгенерировать дату, ограниченную этим интервалом времени, на T-SQL. желательно пример для datetime (не для date).
RAND
7 окт 13, 11:37    [14932812]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сгенерировать случайное целое число в диапазоне от 0 до N, где N не больше разницы в днях между двумя датами
7 окт 13, 11:38    [14932816]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Серега MS SQL
Member

Откуда: Сибирь
Сообщений: 23
Glory,

спасибо
7 окт 13, 11:48    [14932878]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Серега MS SQL
желательно пример для datetime

declare @begin datetime, @end datetime;
select @begin = '1912-04-05T11:23:45', @end = '2048-12-17T23:57:18';

select @begin as [begin], @end as [end], cast(cast(@begin as float) + (cast(@end as float) - cast(@begin as float)) * rand() as datetime) as [random date];
7 окт 13, 11:55    [14932914]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Серега MS SQL
Member

Откуда: Сибирь
Сообщений: 23
Гость333,

неплохой вариант, но не для такого скрипта:

SET NOCOUNT ON
GO

BEGIN tran;

CREATE TABLE #AG_T
(
 AG_NUM INT, 
 AG_STR NVARCHAR(1), 
 AG_ORG_FK INT, 
 AG_ORG_SIMPLE_INT INT, 
 AG_ORG_INDEX INT,
 AG_DATE datetime
);

CREATE NONCLUSTERED INDEX [NonClusteredIndex-XXX] ON #AG_T
(
 AG_DATE ASC
);

declare @begin datetime = '2000-01-01T00:00:00', @end datetime = '2013-12-31T23:59:59';

INSERT INTO #Ag_t
	(
		Ag_num,
		Ag_str,
		Ag_org_fk,
		Ag_org_simple_int,
		Ag_org_index,
		Ag_date
	)
	SELECT TOP 5000000
		CONVERT(int, CONVERT(binary(4), NEWID())),
		CONVERT(nvarchar(1), CONVERT(binary(2), NEWID())),
		CONVERT(int, CONVERT(binary(4), NEWID())),
		CONVERT(int, CONVERT(binary(4), NEWID())),
		CONVERT(int, CONVERT(binary(4), NEWID())),
		CAST(CAST(@Begin AS float) + (CAST(@End AS float) - CAST(@Begin AS float)) * RAND() AS datetime)
	FROM Sysobjects O1, Sysobjects O2, Sysobjects O3, Sysobjects O4;

SELECT
	@@Rowcount;

SELECT
	*
FROM #Ag_t
WHERE Ag_date > '2007-01-01T00:00:00';

DROP TABLE #Ag_t;
 
COMMIT tran;


т.к. для всех 5 000 000 строк будет сгенерировано одно и то же значение Ag_date. может еще какой-нибудь есть вариант?
7 окт 13, 15:09    [14934344]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Серега MS SQL
может еще какой-нибудь есть вариант?

RAND(CHECKSUM(NEWID()))
7 окт 13, 15:23    [14934465]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Серега MS SQL
Member

Откуда: Сибирь
Сообщений: 23
Гость333
Серега MS SQL
может еще какой-нибудь есть вариант?

RAND(CHECKSUM(NEWID()))


прикольно. это Вы с ходу придумали или уже где-то встречали? какой у Вас опыт написания кода на T-SQL?
7 окт 13, 15:53    [14934673]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Серега MS SQL
Member

Откуда: Сибирь
Сообщений: 23
а если вот так
select RAND(CONVERT(int, CONVERT(binary(4), NEWID())))


это хуже/лучше?
7 окт 13, 15:57    [14934702]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Серега MS SQL
это Вы с ходу придумали или уже где-то встречали? какой у Вас опыт написания кода на T-SQL?

Такая конструкция часто встречается; Около 7 лет.

Серега MS SQL
это хуже/лучше?

Так тоже нормально.
7 окт 13, 16:21    [14934931]     Ответить | Цитировать Сообщить модератору
 Re: как сгенерировать случайную дату, лежащую в определенном интервале времени, на T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Серега MS SQL
а если вот так
select RAND(CONVERT(int, CONVERT(binary(4), NEWID())))

это хуже/лучше?
Так тоже можно, но это менее надёжно, потому что зависит от алгоритма формирования NEWID() в ОС (вдруг в новой версии или сервис-паке, или в виртуалке какие то группы разрядов ГУИДа будут одинаковые для экземпляра компа, или для экземпляра виртуальной машины, и т.д.?)
7 окт 13, 18:04    [14935703]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить