Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Серега MS SQL Member Откуда: Сибирь Сообщений: 23 |
т.е. есть дата начала интервала времени и дата окончания интервала времени. нужно сгенерировать дату, ограниченную этим интервалом времени, на T-SQL. желательно пример для datetime (не для date). |
7 окт 13, 11:36 [14932806] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
7 окт 13, 11:37 [14932812] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Сгенерировать случайное целое число в диапазоне от 0 до N, где N не больше разницы в днях между двумя датами |
7 окт 13, 11:38 [14932816] Ответить | Цитировать Сообщить модератору |
Серега MS SQL Member Откуда: Сибирь Сообщений: 23 |
Glory, спасибо |
7 окт 13, 11:48 [14932878] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
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] Ответить | Цитировать Сообщить модератору |
Серега 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] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
RAND(CHECKSUM(NEWID())) |
||
7 окт 13, 15:23 [14934465] Ответить | Цитировать Сообщить модератору |
Серега MS SQL Member Откуда: Сибирь Сообщений: 23 |
прикольно. это Вы с ходу придумали или уже где-то встречали? какой у Вас опыт написания кода на T-SQL? |
||||
7 окт 13, 15:53 [14934673] Ответить | Цитировать Сообщить модератору |
Серега MS SQL Member Откуда: Сибирь Сообщений: 23 |
а если вот такselect RAND(CONVERT(int, CONVERT(binary(4), NEWID()))) это хуже/лучше? |
7 окт 13, 15:57 [14934702] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Такая конструкция часто встречается; Около 7 лет.
Так тоже нормально. |
||||
7 окт 13, 16:21 [14934931] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
7 окт 13, 18:04 [14935703] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |