创建在范围内返回DateTime的随机函数:无效使用副作用运算符

时间:2015-05-06 06:53:11

标签: sql-server datetime sql-server-2012

考虑这个SQL Server代码:

CREATE FUNCTION dbo.CreateRandomDateTime ()
RETURNS DateTime
AS BEGIN
    DECLARE @DateFrom DATETime = '2012-01-01'
    DECLARE @DateTo DATeTime = '2012-06-30'
    DECLARE @DaysRandom Int= 0
    DECLARE @MillisRandom Int=0
    select @DaysRandom= DATEDIFF(day,@DateFrom,@DateTo)
    SELECT @DaysRandom = ROUND(((@DaysRandom -1) * RAND()), 0)

    --get random millis
    SELECT @MillisRandom = ROUND(((99999999) * RAND()), 0)

    SELECT @DateTo = DATEADD(day, @DaysRandom, @DateTo)
    SELECT @DateTo = DATEADD(MILLISECOND, @MillisRandom, @DateTo)
    RETURN @DateTo
END

我想创建一个返回随机DateTime的函数,但是当我执行代码时,我得到:

  

Msg 443,Level 16,State 1,Procedure CreateRandomDateTime,Line 9
  无效使用副作用运算符' rand'在一个函数内。

     

Msg 443,Level 16,State 1,Procedure CreateRandomDateTime,Line 12
  无效使用副作用运算符' rand'在一个函数内。

     

Msg 8116,Level 16,State 1,Procedure CreateRandomDateTime,Line 14
  对于dateadd函数的参数2,参数数据类型datetime无效。

     

Msg 8116,Level 16,State 1,Procedure CreateRandomDateTime,Line 15
  对于dateadd函数的参数2,参数数据类型datetime无效。

但是当我在没有body函数的情况下运行代码时,我得到一个随机的日期时间,所以我觉得这个函数做错了。

我哪里出错了?

1 个答案:

答案 0 :(得分:0)

您可以在创建函数之外移动RAND()运算符,只需将其作为参数传递:

CREATE FUNCTION dbo.CreateRandomDateTime (
    @RAND FLOAT
)
RETURNS DateTime
AS BEGIN
    DECLARE @DateFrom DATETime = '2012-01-01'
    DECLARE @DateTo DATeTime = '2012-06-30'
    DECLARE @DaysRandom Int= 0
    DECLARE @MillisRandom Int=0
    select @DaysRandom= DATEDIFF(day,@DateFrom,@DateTo)
    SELECT @DaysRandom = ROUND(((@DaysRandom -1) * @RAND), 0)

    --get random millis
    SELECT @MillisRandom = ROUND(((99999999) * @RAND), 0)

    SELECT @DateTo = DATEADD(day, @DaysRandom, @DateTo)
    SELECT @DateTo = DATEADD(MILLISECOND, @MillisRandom, @DateTo)
    RETURN @DateTo
END
SELECT DBO.CREATERANDOMDATETIME(RAND())