sql server 特殊日期加减函数的例子

发布时间:2019-08-29编辑:脚本学堂
sql server 特殊日期加减函数的例子,供大家学习参考。if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_DateADD]') and

sql server 特殊日期加减函数的例子,供大家学习参考。
 

复制代码 代码如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_dateadd]') and xtype in (N'FN', N'IF', N'TF'))
  drop function [dbo].[f_DateADD]
GO
  
/**//*--特殊日期加减函数
  
  对于日期指定部分的加减,使用DATEADD函数就可以轻松实现。
  在实际的处理中,还有一种比较另类的日期加减处理
  就是在指定的日期中,加上(或者减去)多个日期部分
  比如将2005年3月11日,加上1年3个月11天2小时。
  对于这种日期的加减处理,DATEADD函数的力量就显得有点不够。
  
  本函数实现这样格式的日期字符串加减处理:
  y-m-d h:m:s.m | -y-m-d h:m:s.m
  说明:
  要加减的日期字符输入方式与日期字符串相同。日期与时间部分用空格分隔
  最前面一个字符如果是减号(-)的话,表示做减法处理,否则做加法处理。
  如果日期字符只包含数字,则视为日期字符中,仅包含天的信息。
--*/
  
/**//*--调用示例
  
  SELECT dbo.f_DateADD(GETDATE(),'11:10')
--*/
  
CREATE FUNCTION dbo.f_DateADD(
@Date   datetime,
@DateStr  varchar(23)
)RETURNS datetime
AS
BEGIN
  DECLARE @bz int,@s varchar(12),@i int
  
  IF @DateStr IS NULL OR @Date IS NULL
    OR(CHARINDEX('.',@DateStr)>0
      AND @DateStr NOT LIKE '%[:]%[:]%.%')
    RETURN(NULL)
  IF @DateStr='' RETURN(@Date)
  
  SELECT @bz=CASE
      WHEN LEFT(@DateStr,1)='-' THEN -1
      ELSE 1 END,
    @DateStr=CASE
      WHEN LEFT(@Date,1)='-'
      THEN STUFF(RTRIM(LTRIM(@DateStr)),1,1,'')
      ELSE RTRIM(LTRIM(@DateStr)) END
  
  IF CHARINDEX(' ',@DateStr)>1
    OR CHARINDEX('-',@DateStr)>1
    OR(CHARINDEX('.',@DateStr)=0
      AND CHARINDEX(':',@DateStr)=0)
  BEGIN
    SELECT @i=CHARINDEX(' ',@DateStr+' ')
      ,@s=REVERSE(LEFT(@DateStr,@i-1))+'-'
      ,@DateStr=STUFF(@DateStr,1,@i,'')
      ,@i=0
    WHILE @s>'' and @i<3
      SELECT @Date=CASE @i
          WHEN 0 THEN DATEADD(Day,@bz*REVERSE(LEFT(@s,CHARINDEX('-',@s)-1)),@Date)
          WHEN 1 THEN DATEADD(Month,@bz*REVERSE(LEFT(@s,CHARINDEX('-',@s)-1)),@Date)
          WHEN 2 THEN DATEADD(Year,@bz*REVERSE(LEFT(@s,CHARINDEX('-',@s)-1)),@Date)
        END,
        @s=STUFF(@s,1,CHARINDEX('-',@s),''),
        @i=@i+1        
  END
  IF @DateStr>''
  BEGIN
    IF CHARINDEX('.',@DateStr)>0
      SELECT @Date=DATEADD(Millisecond
          ,@bz*STUFF(@DateStr,1,CHARINDEX('.',@DateStr),''),
          @Date),
        @DateStr=LEFT(@DateStr,CHARINDEX('.',@DateStr)-1)+':',
        @i=0
    ELSE
      SELECT @DateStr=@DateStr+':',@i=0
    WHILE @DateStr>'' and @i<3
      SELECT @Date=CASE @i
          WHEN 0 THEN DATEADD(Hour,@bz*LEFT(@DateStr,CHARINDEX(':',@DateStr)-1),@Date)
          WHEN 1 THEN DATEADD(Minute,@bz*LEFT(@DateStr,CHARINDEX(':',@DateStr)-1),@Date)
          WHEN 2 THEN DATEADD(Second,@bz*LEFT(@DateStr,CHARINDEX(':',@DateStr)-1),@Date)
        END,
        @DateStr=STUFF(@DateStr,1,CHARINDEX(':',@DateStr),''),
        @i=@i+1
  END
  
  RETURN(@Date)
END
GO