我的数据库中有一个临时表,其中包含利率和期间:
Rate | Period
-----+--------
3 | Week
1 | Month
2 | Month
1 | Week
3 | Year
1 | Monh
1 | Month
1 | Month
1 | Month
1 | Month
1 | Month
6 | Year
2 | Month
我需要为2014年生成随机日期。例如,“6年”应为2014年的6个随机日期。1周应为2014年每周的随机日期。有人可以帮助我吗?
所以,这就是我的函数。但是日期不是几乎正确的。也许任何人都可能发现错误?
CREATE FUNCTION GenerateDate(@date_from date, @Rate int, @Period nvarchar(50))
RETURNS @LIST TABLE(item date)
BEGIN
DECLARE @i int, @j int, @d int
DECLARE @date date
IF (@Period LIKE 'Y%')
BEGIN
SET @i=0
WHILE (@i < @Rate)
BEGIN
SET @date = DATEADD (day, dbo.Amount(0,364), @date_from)
IF @date NOT IN (SELECT * FROM @LIST)
BEGIN
INSERT INTO @LIST VALUES (@date)
SET @i=@i+1
END
END
END
IF (@Period LIKE 'M%')
BEGIN
SET @i=1
WHILE (@i <= 12)
BEGIN
SET @j=0
SET @d = CASE @i
WHEN 2 THEN 28
WHEN 4 THEN 30
WHEN 6 THEN 30
WHEN 9 THEN 30
WHEN 11 THEN 30
ELSE 31
END
WHILE (@j < @Rate)
BEGIN
SET @date = DATEADD (day, dbo.Amount(0,@d-1), @date_from)
IF @date NOT IN (SELECT * FROM @LIST)
BEGIN
INSERT INTO @LIST VALUES (@date)
SET @j=@j+1
END
END
SET @date_from = DATEADD (month, 1, @date_from)
SET @i=@i+1
END
END
IF (@Period LIKE 'W%')
BEGIN
SET @i = 1
WHILE (@i <= 52)
BEGIN
SET @j=0
WHILE (@j < @Rate)
BEGIN
SET @date = DATEADD (day, dbo.Amount(0,6), @date_from)
IF @date NOT IN (SELECT * FROM @LIST)
BEGIN
INSERT INTO @LIST VALUES (@date)
SET @j=@j+1
END
END
SET @date_from = DATEADD (week, 1, @date_from)
SET @i=@i+1
END
END
RETURN
END
CREATE FUNCTION Amount(@AmountMin float, @AmountMax float)
RETURNS float
AS
BEGIN
DECLARE @Amount float = (SELECT new_rand FROM RandomNumbers)*(@AmountMax-@AmountMin) + @AmountMin
RETURN @Amount
END
GO
CREATE VIEW RandomNumbers
AS
SELECT cast( RAND(CHECKSUM(NEWID()))*1000 AS INT) AS new_rand
GO
5条答案
按热度按时间holgip5t1#
要在2014年获得6个不同的日期,您可以尝试以下内容-
您可以编写一个函数,它将接受所需日期和年份的编号
f5emj3cl2#
让我们来为一个星期随机选择一个日期:首先,我们得到了我们要拍摄的时间长度
这将返回10080作为一周中的最大分钟数。
此代码从现在开始在一周范围内随机获取一分钟。
您可以很容易地将其更改为使用天,但我认为作为示例,日期时间会更有趣。
pvcm50d13#
使用日历表进行概念验证!
你可以在网上找到如何建立一个日历表。
改进了连接到表的代码...
noj0wjuj4#
我用这个方法从当前月份中随机获取一个日期:
说明:
abithluo5#
例如,如果要生成2009-12-25和2009-12-28之间的随机日期,则可编写
选择“2009-12-25”+间隔兰德()*3天
对我来说,我想要一个2008年到2009年之间的值(一年:60秒 * 60分钟 * 24小时 * 365天= 31536000)。由于Unix时间戳不支持分数,因此需要将该值舍入为整数。(取下限或舍入该值)。