1

これをユーザー定義関数として書きたいと思います:

private double Score(Story s){            
               DateTime now = DateTime.Now;            
               TimeSpan elapsed = now.Subtract(s.PostedOn);            
               double daysAgo = elapsed.TotalDays;            
               return s.Votes.Count + s.Comments.Count - daysAgo;       
                              }

これはUDFで行うことができますか?

4

2 に答える 2

2

可能ですが、SQL Server 2000 を使用している場合は、"now" の値を渡す必要があります。SQL Server 2000 では、UDF 自体が非決定論的な値を生成することはできませ

このテストされていない刺し傷は近いかもしれません:

CREATE FUNCTION dbo.GetStoryScore (
    @Now DATETIME, @Posted DATETIME, @Votes INT, @Comments INT
) RETURNS FLOAT AS
BEGIN

  RETURN @Votes + @Comments - DATEDIFF(HOUR, @Posted, @Now)/24.0

END

使用例:

SELECT S.ID, dbo.GetStoryScore(GETDATE(), S.Posted, S.Votes, S.Comments) AS Score
FROM Stories AS S
WHERE ...

ノート:

  • datediff は (日ではなく) 時間単位で実行されます。これは、より細かい単位を使用すると整数の結果がもう少し正確になるためです。

  • 関数内のルックアップはパフォーマンスにとって非常に悪いことがわかったので、すべての値を渡しました。

  • dbo.SQL で参照する場合は、関数名の前に を忘れないでください。

  • SQL Server 2005 を使用している場合は、@Now 変数を削除して、代わりに GETDATE() をインラインで使用できます。

于 2009-01-15T03:28:45.357 に答える
0

私が想像する次のようなもの:

CREATE FUNCTION [dbo].[Score]
(@storyid int)
RETURNS float
AS
BEGIN
    DECLARE @ret float;
    DECLARE @elapsed float;

    SELECT @elapsed = DATEDIFF(n, getdate(), postedon) / 1440
    FROM stories WHERE storyid = @storyid;

    SET @ret = ((SELECT count(voteid) FROM votes WHERE storyid = @storyid) +
                    (SELECT count(commentid) FROM comments WHERE storyid = @storyid) -
                    @elapsed);
    RETURN @ret;
END
于 2009-01-15T03:37:33.953 に答える