如何使用带有 select 语句的 UDF?
How do I use a UDF with a select statement?
我创建了一个标量用户定义函数,它将接受出生日期和 return 一个人从现在起 15 年后的年龄。
CREATE FUNCTION AgeIn15 (@DateOfBirth DATE)
RETURNS INT
AS
BEGIN
RETURN Convert(INT, DateAdd(year, 15, DateDiff(year, @DateOfBirth, GetDate())))
END
现在我想使用创建的 UDF 来显示我 table 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
添加架构名称:
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)
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())))
- 计算
DATEDIFF
- 它 returns 数年 OK
DATEADD(year, 15, number)
- returns 日期 15 年 + 1900-01-number
FAIL
CONVERT(INTEGER, DATE)
- 从 1900-01-01
开始的 returns 天数 FAIL
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
希望这对您有所帮助
我创建了一个标量用户定义函数,它将接受出生日期和 return 一个人从现在起 15 年后的年龄。
CREATE FUNCTION AgeIn15 (@DateOfBirth DATE)
RETURNS INT
AS
BEGIN
RETURN Convert(INT, DateAdd(year, 15, DateDiff(year, @DateOfBirth, GetDate())))
END
现在我想使用创建的 UDF 来显示我 table 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
添加架构名称:
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)
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())))
- 计算
DATEDIFF
- 它 returns 数年 OK DATEADD(year, 15, number)
- returns 日期 15 年 +1900-01-number
FAILCONVERT(INTEGER, DATE)
- 从1900-01-01
开始的 returns 天数 FAIL
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
希望这对您有所帮助