2012-09-25 27 views
0

我已經構建了一個select語句來選擇參與者首次記錄在數據庫中的日期。但是我想從這個select語句創建一個函數來使用它。我對SQL相當陌生,以前從未構建函數。我的SELECT語句如下所示:從SQL中的select語句創建函數

Select DATEDIFF(day, (select min(startdatetime) 
         from GamePlay 
        ), enddatetime) 
    from GamePlay 
where ParticipantID = '200' 

我嘗試使用的功能是這樣的:

CREATE FUNCTION daysPlayed (@ParticipantID int) 
RETURNS DateTime 
AS 
BEGIN 
    Return DATEDIFF(day, (select min(startdatetime) 
          from GamePlay 
         ), enddatetime) 
     from GamePlay 
    where ParticipantID = @ParticipantID 
END 
GO 
+0

聽起來像是你想要一個存儲過程來代替。 –

+0

我想調用視圖中的函數來創建一個列? – Bradley

回答

3

DATEDIFF不返回日期時間。它返回一個int。

你的功能可能是這樣的:

CREATE FUNCTION daysPlayed (@ParticipantID int) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @result INT 
    SELECT @result=DATEDIFF(day, (select min(startdatetime) from GamePlay), enddatetime) from GamePlay where ParticipantID = @ParticipantID 
    RETURN @result 

END 

,但我不認爲它會做你想要它做的事情。 另外,請注意,使用函數在大量行中進行選擇是一種保證性能的命中,您可能無法使用表中設置的一些索引。

1

我完全不知道你想要什麼,但看到這個樣本可能是有益的

CREATE FUNCTION mDay (@Date nchar(10)) 
RETURNS nchar(2) 
AS 
BEGIN 
RETURN substring(@Date,9,2) 
END 


SELECT  dbo.Courses.MID, dbo.Masters.ID, dbo.Masters.Name,COUNT(CASE dbo.mDay(CDate) WHEN '01' THEN 2 END) AS day1 

FROM   dbo.Courses INNER JOIN 
        dbo.Masters ON dbo.Courses.MID = dbo.Masters.MCode 
WHERE  (dbo.Courses.CLevel = @Kind) AND (dbo.Courses.CDate BETWEEN @Date1 AND @Date2) 
GROUP BY dbo.Courses.MID, dbo.Masters.Name, dbo.Masters.Family, dbo.Masters.ID