Tôi có viết thư cho bạn chức năng này đơn giản mà trả về một ngày ngẫu nhiên giữa phạm vi ngày:
create function date_rand (@fromDate date, @toDate date) returns date
as
begin
declare @days_between int
declare @days_rand int
set @days_between = datediff(day,@fromDate,@toDate)
set @days_rand = cast(RAND()*10000 as int) % @days_between
return dateadd(day, @days_rand, @fromDate)
end
để gọi hàm:
select dbo.date_rand('1/1/2001', '10/1/2001')
bạn có thể kết hợp chức năng với một máy phát điện hàng:
;WITH Nbrs_3(n) AS (SELECT 1 UNION SELECT 0),
Nbrs_2(n) AS (SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2),
Nbrs_1(n) AS (SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2),
Nbrs_0(n) AS (SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2),
Nbrs (n) AS (SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2)
SELECT dbo.date_rand('1/1/2001', '10/1/2001')
FROM (SELECT ROW_NUMBER() OVER (ORDER BY n)
FROM Nbrs) D (n)
WHERE n <= 1000
CHỈNH SỬA
Để tạo số ngẫu nhiên sử dụng:
RAND(CHECKSUM(NEWID()))
thay vì RAND()
EDITED II 'sử dụng không hợp lệ của một nhà điều hành phụ ảnh hưởng '
Chức năng lợi nhuận rand' vòng một lỗi chức năng '. Điều này là bởi vì chúng ta không thể sử dụng các hàm không xác định như RAND() hoặc NEWID().
Một cách giải quyết là để create a view like:
create view myRandomNumber as
select cast(RAND(CHECKSUM(NEWID()))*1000 as int) as new_rand
và sau đó sử dụng nó trong chức năng:
...
select @days_rand = new_rand % @days_between from myRandomNumber
...
hoặc đơn giản không sử dụng các chức năng và viết expresion trên chọn. Tôi đã viết một chức năng chỉ yo giải thích từng bước các solucion.
declare @fromdate date
declare @todate date
set @fromdate = '1/1/2001'
set @todate = '10/1/2001'
;WITH Nbrs_3(n) AS (SELECT 1 UNION SELECT 0),
Nbrs_2(n) AS (SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2),
Nbrs_1(n) AS (SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2),
Nbrs_0(n) AS (SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2),
Nbrs (n) AS (SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2)
SELECT
dateadd(day,
cast(RAND(CHECKSUM(NEWID()))*1000 as int) %
datediff(day,@fromDate,@toDate),
@fromDate)
FROM (SELECT ROW_NUMBER() OVER (ORDER BY n)
FROM Nbrs) D (n)
WHERE n <= 1000
Bạn có thể test here this query.
Phiên bản nào của SQL Server để bạn sử dụng? Tôi đã thử nghiệm trong SQL Server 2012 và có 'Sử dụng không hợp lệ toán tử tác dụng phụ 'rand' trong một hàm.'. –
Cảm ơn @MikaelEriksson, tôi đã sửa lỗi truy vấn. Trân trọng. – danihp