0

参加者がデータベースに最初に記録された日付を選択するためのselectステートメントを作成しました。ただし、この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
4

2 に答える 2

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

しかし、私はそれがあなたがしたいことをするだろうとは思いません。また、多数の行のselectで関数を使用すると、パフォーマンスが低下することが保証され、テーブルに設定したインデックスの一部を使用できない場合があることに注意してください。

于 2012-09-25T16:23:12.287 に答える
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
于 2012-09-25T16:29:20.597 に答える