想请教一下关于自定义函数编写的问题,因为第一次用,希望大家多帮助,谢谢
需求概述:有一张表ag1tab,里面有个日期字段probation_date,但是这个字段是字符型的,
形式是这样:20040623,varchar(8)。现在要通过这个日期来计算月份,就是随便输入
一个zprobation_date字段里的字符,可以计算出到现在(也就是getdate())为止一共有几个月。现在编有一段代码,但是运行有点问题,希望大家指点一下:
create function mon(@inputprobation_date varchar(8)) returns table
as
return
(select datediff(mm,@inputprobation_date,
case when status='A' then getdate() else cast(T_DATE+18000000 as varchar(8)) end) + 1 mon
from ag1tab
where probation_date > 0
)
运行后说:
服务器: 消息 443,级别 16,状态 1,过程 mon,行 5
在函数内不正确地使用了 'getdate'。我知道可能函数用得有点问题,但语句问题应该是不大的。请大家费心帮助,谢谢。
需求概述:有一张表ag1tab,里面有个日期字段probation_date,但是这个字段是字符型的,
形式是这样:20040623,varchar(8)。现在要通过这个日期来计算月份,就是随便输入
一个zprobation_date字段里的字符,可以计算出到现在(也就是getdate())为止一共有几个月。现在编有一段代码,但是运行有点问题,希望大家指点一下:
create function mon(@inputprobation_date varchar(8)) returns table
as
return
(select datediff(mm,@inputprobation_date,
case when status='A' then getdate() else cast(T_DATE+18000000 as varchar(8)) end) + 1 mon
from ag1tab
where probation_date > 0
)
运行后说:
服务器: 消息 443,级别 16,状态 1,过程 mon,行 5
在函数内不正确地使用了 'getdate'。我知道可能函数用得有点问题,但语句问题应该是不大的。请大家费心帮助,谢谢。
as
return
(select datediff(mm,@inputprobation_date,
case when status='A' then dbo.getdate() else cast(T_DATE+18000000 as varchar(8)) end) + 1 mon
from ag1tab
where probation_date > 0
)
可以作个视图代替
方法1:
----创建封装当前日期的视图
create view vGetDate
as
select getdate() as now
GO
----在函数中引用该视图
create function mon(@inputprobation_date varchar(8)) returns table
as
return
(select datediff(mm,@inputprobation_date,
case when status='A' then (select now from vGetDate) else cast(T_DATE+18000000 as varchar(8)) end) + 1 mon
from ag1tab
where probation_date > 0
)方法2:
将getdate()作为函数的参数
服务器: 消息 208,级别 16,状态 1,过程 mon,行 4
对象名 'dbo.getdate' 无效。
还是不行,再请大家想想办法
create view vGetDate
as
select getdate() as now
GO
是不是数据库每日都会更新,还是以后运行是要重新创建
将getdate()作为函数的参数
这个具体方法是什么?怎么操作呢?