确定了日期字符格式后,处理方法就可以这样确定:获取日期字符的第一个字符,判断处理方式,然后将要加减的日期字符按空格分拆为日期和时间两部分,对于日期部分从低位到高位逐个截取日期数据进行处理,对于时间从高位到低位逐个处理。 以下是实现日期的多个部分同时加减处理的用户定义函数代码: 复制代码 代码如下: CREATE FUNCTION 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