标签:
CHECKSUM ( * | expression [ ,...n ] ) 此函数生成按照表的某一行或一组表达式计算出来的int校验和值,CHECKSUM 用于生成哈希索引(详细说明查看https://technet.microsoft.com/zh-cn/library/ms189788(v=sql.90).aspx)。
1 IF OBJECT_ID(N‘dbo.vRandomGuid‘, ‘V‘) IS NOT NULL 2 BEGIN 3 DROP VIEW dbo.vRandomGuid; 4 END 5 GO 6 7 --================================== 8 -- 功能: 随机Guid视图 9 -- 说明: 具体实现阐述 10 -- 作者: XXX 11 -- 创建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改内容描述 13 --================================== 14 CREATE VIEW dbo.vRandomGuid 15 --$Encode$-- 16 AS 17 SELECT RandomGuid = NEWID(); 18 GO 19 20 调用该视图的T-SQL代码如下: 21 SELECT TOP 1 RandomGuid 22 FROM dbo.vRandomGuid; 23 GO
执行后的查询结果如下:
1 IF OBJECT_ID(N‘dbo.ufn_RandNum‘, ‘FN‘) IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_RandNum; 4 END 5 GO 6 7 --================================== 8 -- 功能: 获取区间内的任意一个随机数值 9 -- 说明: 具体实现阐述 10 -- 作者: XXX 11 -- 创建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改内容描述 13 -- 调用: SELECT dbo.ufn_RandNum(0, 1); 14 --================================== 15 CREATE FUNCTION dbo.ufn_RandNum 16 ( 17 @intMin INT, -- 随机数值的最小值 18 @intMax INT -- 随机数值的最大值 19 ) RETURNS INT 20 --$Encode$-- 21 AS 22 BEGIN 23 SET @intMin = ISNULL(@intMin, 0); 24 SET @intMax = ISNULL(@intMax, 0); 25 26 DECLARE @guidValue AS UNIQUEIDENTIFIER; 27 28 SELECT TOP 1 @guidValue = RandomGuid 29 FROM dbo.vRandomGuid; 30 31 RETURN ABS(CHECKSUM(@guidValue)) % (@intMax - @intMin + 1) + @intMin; 32 END 33 GO
1 SELECT dbo.ufn_RandNum(0, 1) AS RandNum, dbo.ufn_RandNum(10, 11) AS RandNum2; 2 GO
1 IF OBJECT_ID(N‘dbo.ufn_RandDate‘, ‘FN‘) IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_RandDate; 4 END 5 GO 6 7 --================================== 8 -- 功能: 获取日期区间内的任意一个随机日期 9 -- 说明: 具体实现阐述 10 -- 作者: XXX 11 -- 创建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改内容描述 13 -- 调用: SELECT @dtmRand = dbo.ufn_RandDate(‘2007-02-01‘, ‘2007-03-01‘); 14 --================================== 15 CREATE FUNCTION dbo.ufn_RandDate 16 ( 17 @dtmMin DATETIME, -- 随机日期的最小值 18 @dtmMax DATETIME -- 随机日期的最大值 19 ) RETURNS DATETIME 20 --$Encode$-- 21 AS 22 BEGIN 23 SET @dtmMin = ISNULL(@dtmMin, ‘2000-01-01‘); 24 SET @dtmMax = ISNULL(@dtmMax, ‘2000-01-01‘); 25 DECLARE @guidVue AS UNIQUEIDENTIFIER; 26 27 SELECT TOP 1 @guidVue = RandomGuid 28 FROM dbo.vRandomGuid; 29 30 -- 可以将HOUR换为DAYS 31 RETURN DATEADD(HOUR, (ABS(CHECKSUM(@guidVue)) % (1 + DATEDIFF(HOUR, @dtmMax, @dtmMin))), @dtmMin); 32 END 33 GO
1 SELECT dbo.ufn_RandDate(‘2015-12-01‘, ‘2015-12-21‘) AS RandDate, dbo.ufn_RandDate(‘2016-12-01‘, ‘2016-12-21‘) AS RandDate2; 2 GO
执行后的查询结果如下:
1 SELECT TOP 1 Num 2 FROM dbo.SeqDataTable 3 WHERE Num BETWEEN @intMin AND @intMax 4 ORDER BY NEWID() ASC;
当然也可以利用以上的数字序列SeqDataTable(Num INT),日期区间[@dtmMin,@dtmMax],那个该数字区间任意一个随机日期的T-SQL代码如下:
1 SELECT TOP 1 DATEADD(DAY, Num, @dtmMin) 2 FROM dbo.SeqDataTable 3 WHERE Num BETWEEN 0 AND DATEDIFF(DAY, @dtmMax, @dtmMin) 4 ORDER BY NEWID() ASC;
注意:以上代码无法执行成功的,也算是伪代码的。
SQL Server中的RAND函数的介绍和区间随机数值函数的实现
标签:
原文地址:http://www.cnblogs.com/dzy863/p/5063558.html