在该章这前,我们必须先了解数字与日期之间的转换规则。
可能还有很多的朋友还不清楚甚至还不知道数字与日期之间能够相互转换。我们先来看一个示例:
select convert(float,convert(datetime,'2008-1-1'))
该sql会报错吗?日期格式的值能转换为数字吗?答案是当然可以的,以上sql返回结果39446。那么,为什么是这个结果呢?我们再来看一个sql.
select dateadd(d,39446,'1900-01-01')
返回结果2008-01-01 00:00:00.000,再看一个示例:
select convert(datetime,39446)
返回结果2008-01-01 00:00:00.000
呵呵,从上面的示例结果中相信大家已经看明白了,
在sql server中日期与数字之间的转换,就是返回从1900-01-01开始到转化的日期之间的天数。反过来,
从数字转换成日期,就是返回1900-01-01加上转化数字的天数后的日期。
明白了这个规则,我们就开始今天的示例了:在sql server数据库中取指定范围内的随机日期
示例如下:
Create FUNCTION [dbo].[udf_GetRandomDatetime]
(
@MinValue datetime = null,
@MaxValue datetime = null
)
RETURNS datetime
AS
/*
函数名称:udf_GetRandomDatetime
功能简述:取随机日期
相关对象:无
参数:@MinValueDecimal 最小值
@MaxValueDecimal 最大值
*/
BEGIN
declare @RandomValue float
declare @ReturnValueDecimal Datetime
declare @MinValueDecimal decimal
declare @MaxValueDecimal decimal
--取最小日期对应的数值
if @MinValue is not null
begin
select @MinValueDecimal = convert(float,@MinValue)
end
--取最大日期对应的数值
if @MaxValue is not null
begin
select @MaxValueDecimal = convert(float,@MaxValue)
end
while(1=1)
begin
--从随机数视图中获取一个随机值(函数中不能直接使用rand())
select @RandomValue = RandValue
from V_Rand
--根据最大最小值获取随机整数
if @MinValueDecimal is not null and @MaxValueDecimal is not null
begin
select @ReturnValueDecimal = @RandomValue * @MaxValueDecimal
if @ReturnValueDecimal >= @MinValueDecimal and @ReturnValueDecimal <= @MaxValueDecimal
begin
break
end
end
else if @MinValueDecimal is not null and @MaxValueDecimal is null
begin
select @ReturnValueDecimal = @RandomValue * @MinValueDecimal
if @ReturnValueDecimal >= @MinValueDecimal
begin
break
end
end
else if @MinValueDecimal is null and @MaxValueDecimal is not null
begin
select @ReturnValueDecimal = @RandomValue * @MaxValueDecimal
if @ReturnValueDecimal <= @MaxValueDecimal
begin
break
end
end
else if @MinValueDecimal is null and @MaxValueDecimal is null
begin
select @ReturnValueDecimal = @RandomValue
break
end
end
return convert(datetime,@ReturnValueDecimal)
END
注意:与上一章一样的情况,该示例中需要用到Rand()函数,但又因为在自定义函数中不能使用Rand函数,所以我们创建了V_Rand视图来解决该问题,具体请看上一章:
在sql server数据库中取指定范围内的随机整数示例执行sql,自定义函数创建成功,我们再来调用函数看一下结果吧:
select dbo.udf_GetRandomDatetime('2008-1-1','2010-12-1')
执行上面的sql,它是不是总是返回2008-1-1与2010-12-1之间的日期值呢?