/****************************** * 函数名:RandDateTime * 作用: 返回两个时间范围内的一个随机时间 * Author: 兰习刚 * Date: 2009-11-30 *******************************/ Go --创建函数 create Function RandDateTime ( @RandNum Decimal(38,18),--0-1之际随机数值建议Rand() @StartTime DateTime, --第一个时间 @EndTime DateTime --第二个时间 ) Returns DateTime As Begin Declare @HourDiff Decimal(38,18) --两个时间之间的小时差值 Declare @MsPartDiff Decimal(38,18) --毫秒部分的差值 Declare @SmallDate DateTime Declare @ReturnDateTime DateTime /*取各部分差值*/ Set @HourDiff = DateDiff(hh,@StartTime,@EndTime) Set @MsPartDiff = Abs(DateDiff(ms,DateAdd(hh,@HourDiff,@StartTime),@EndTime)) Select @SmallDate=(Case When @HourDiff>0 Then @StartTime Else @EndTime End) --取较小的时间 Set @HourDiff = Abs(@HourDiff) ActionLable: Declare @HourDecimal Decimal(38,18) --小时的小数部分 Declare @HourString varchar(200) Set @HourDiff = @HourDiff * @RandNum Set @HourString = CONVERT(VARCHAR(200),@HourDiff) Set @HourString = SubString(@HourString,CharIndex('.',@HourString)+1,Len(@HourString)) Set @HourString = '0.' + @HourString Set @HourDecimal = Convert(Decimal(38,18),@HourString) --获得小时的小数部分 Set @MsPartDiff = (@MsPartDiff + @HourDecimal * 3600*1000) * @RandNum /*毫秒差值 由于之前@MsPartDiff是两个时间小时之后的毫秒差值 @HourDecimal * 3600*1000 有小时的小数部分的毫秒差值不会大于小时 毫秒不会溢出 */ Set @ReturnDateTime = DateAdd(hh,@HourDiff,@SmallDate) Set @ReturnDateTime = DateAdd(ms,@MsPartDiff,@ReturnDateTime) Return @ReturnDateTime End --测试示例 select dbo.RandDateTime(Rand(),'2011-03-21 00:00:00.000','2011-03-21 23:59:00.000') go 10 --运行结果 /* ----------------------- 2011-03-21 16:44:58.990 (1 row(s) affected) ----------------------- 2011-03-21 00:00:33.313 (1 row(s) affected) ----------------------- 2011-03-21 15:04:58.777 (1 row(s) affected) ----------------------- 2011-03-21 06:32:21.347 (1 row(s) affected) ----------------------- 2011-03-21 15:11:51.047 (1 row(s) affected) ----------------------- 2011-03-21 14:39:23.597 (1 row(s) affected) ----------------------- 2011-03-21 07:24:17.247 (1 row(s) affected) ----------------------- 2011-03-21 06:15:49.653 (1 row(s) affected) ----------------------- 2011-03-21 02:06:14.757 (1 row(s) affected) ----------------------- 2011-03-21 10:49:18.370 (1 row(s) affected) */