重写dateadd()函数

dateadd()函数的语法格式:

dateadd(y[,m,d],int,expression)

在使用dateadd的过程中你会发现,当dateadd()函数的第一个参数为‘m‘时,dateadd()函数只单纯的在月份上加减某个整数值,但是有可能你会遇到这样的的问题,例如:日期是'2009-06-30'(月末)时,只想将该日期推前三个月,即'2009-03-31',此时如果使用dateadd(m,-3,'2009-06-30')函数显然不能达到你的要求,因为每年的三月份是月大,也就是有31天,而在三月份是存在30日的,所以使用dateadd(m,-3,'2009-06-30')得到的结果是'2009-03-30'日,显然跟你想要的结果是有出入的。

要想解决此问题,我们可以采用自定义函数来实现该功能:

create function dtadd(@ymd varchar(2),@count int,@dttime datetime)
returns datetime
as
begin
  if @ymd='y'
    begin
      set @dttime=dateadd(y,@count,@dttime)
    end
  if @ymd='m'
    begin
      set @dttime=dateadd(d,-1,dateadd(m,1,substring(convert(varchar(10),dateadd(m,@count,@dttime),23),0,8)+'-1'))
    end
  if @ymd='d'
    begin
      set @dttime=dateadd(d,@count,@dttime)
    end
  return (@dttime)
end

现在进行测试:

select dbo.dtadd('m',-3,'2009-06-30')  --注意:调用自定义函数时,必须添加前缀'dbo.',不然调用函数是会提示"'dtadd' 不是可以识别的 函数名。"

返回结果:

2009-03-31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值