【问题标题】:How do I use a UDF with a select statement?如何将 UDF 与 select 语句一起使用?
【发布时间】:2015-09-29 04:26:50
【问题描述】:

我创建了一个用户定义的标量函数,它将接受出生日期并返回一个人在 15 年后的年龄。

CREATE FUNCTION AgeIn15 (@DateOfBirth DATE)
RETURNS INT
AS
BEGIN
    RETURN Convert(INT, DateAdd(year, 15, DateDiff(year, @DateOfBirth, GetDate())))
END

现在我想使用创建的 UDF 来显示我的表 marketing_list 中所有人的年龄以及他们的原始信息。我该怎么做呢?我试过了,但我得到了一个错误

SELECT *
FROM marketing_list AgeIn15(marketing_list.DateOfBirth)

SELECT *
    ,AgeIn15(marketing_list.Date_of_Birth)
FROM marketing_list
WHERE AgeIn15(Date_of_Birth) > 45

【问题讨论】:

    标签: sql-server user-defined-functions


    【解决方案1】:

    添加架构名称:

    SELECT *, dbo.AgeIn15(m.Date_of_Birth) AS col_name
    FROM marketing_list AS m;
    
    SELECT *
        ,dbo.AgeIn15(m.Date_of_Birth) AS col_name
    FROM marketing_list m
    WHERE dbo.AgeIn15(m.Date_of_Birth) > 45
    

    您可以选择使用CROSS APPLY:

    Select *
    from marketing_list AS m
    CROSS APPLY (SELECT dbo.AgeIn15(m.Date_of_Birth)) AS c(col_name)
    

    Demo

    SELECT  *, dbo.AgeIn15(t.c) AS col_name
    FROM (SELECT '2000-01-01') AS t(c);
    
    SELECT  *
    FROM (SELECT '2000-01-01') AS t(c)
    CROSS APPLY (SELECT dbo.AgeIn15(t.c)) AS c(col_name)
    

    你的函数应该是这样的:

    CREATE FUNCTION dbo.AgeIn15 (@DateOfBirth DATE)
    RETURNS INTEGER
    AS
    BEGIN
        RETURN DATEDIFF(year,@DateOfBirth,GETDATE()) + 15
    END
    

    你所做的没有任何意义:

    Convert(integer,DateAdd(year,15,DateDiff(year,@DateOfBirth,GetDate())))
    
    1. 计算DATEDIFF - 它返回数字年OK
    2. DATEADD(year, 15, number) - 它返回日期 15 年 + 1900-01-number FAIL
    3. CONVERT(INTEGER, DATE) - 它返回从 1900-01-01 开始的天数 FAIL

    【讨论】:

    • 谢谢..我尝试了第一个,但我的年龄从 5493 开始,当时这个人 15 岁..应该是 30 岁
    • @user2127184 你的函数没有意义。我重写它并制作新的演示
    • 嘿,请告诉我,但这是我第一次看到这种语法,所以我不知道“t”和“c”是什么意思。我看到派生表和列。我想在我的表 marketing_list 中显示年龄以及所有信息
    • @user2127184 t 和 c 只是别名,您可以使用任何有效标识符的名称
    • @user2127184 查看前两个查询,它们是你的,演示只是为了展示它是如何工作的
    【解决方案2】:
    CREATE FUNCTION AgeIn15 (@DateOfBirth DATE)
    RETURNS INT
    AS
    BEGIN
        RETURN 
           -- get the year today + 15 years
           (
              (DATEPART(YEAR, GETDATE() ) + 15) - 
              -- minus the year of date of birth
              DATEPART(YEAR,@DateOfBirth)
           )
           -- its like saying (2015 + 15)-09-29 - (1990)-09-19 = 40
    END
    
    SELECT *
        , dbo.AgeIn15(mlist.Date_of_Birth) AS [AgeAfterFifteenYears]
    FROM marketing_list AS mlist
    

    希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2022-09-15
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多