Pregunta

Me gustaría escribir esto como una función definida por el usuario:

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;       
                              }

¿Es esto posible hacer con un UDF?

¿Fue útil?

Solución

Puede, pero si está utilizando SQL Server 2000, tendrá que pasar el valor de " ahora " los UDF no pueden generar ningún valor no determinista por sí mismos en SQL Server 2000 .

Esta puñalada no probada podría estar cerca:

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

Ejemplo de uso:

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

Notas:

  • El fechado se realiza en horas (no días) porque el resultado entero le da un poco más de precisión cuando utiliza unidades más finas.

  • Pasé todos los valores porque he encontrado que las búsquedas dentro de las funciones son muy, muy malas para el rendimiento.

  • Cuando se hace referencia en SQL, no olvide el dbo. delante del nombre de la función.

  • Si está utilizando SQL Server 2005, puede eliminar la variable @Now y usar GETDATE () en línea, en su lugar.

Otros consejos

Algo parecido a lo siguiente me imagino:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top