日期加減處理

2021-04-30 21:46:38 字數 2708 閱讀 7605

日期加減處理

對於日期指定部分的加減,使用

dateadd

函式就可以輕鬆實現。在實際的處理中,還有一種比較另類的日期加減處理,就是在指定的日期中,加上(或者減去)多個日期部分,比如將

2023年3

月11日,加上1年

3個月11天

2小時。對於這種日期的加減處理,

dateadd

函式的力量就顯得有點不夠。

要實現多個日期部分的加減處理,最主要的就是把要加減的日期字元分解,然後根據分解的結果在指定日期的對應日期部分加上相應的值,其難點在於如何分解日期字元,以及判斷分解後的日期字元屬於哪個日期部分。要順利地分解出日期字元的話,首先要規定日期加減的日期字元的格式,可以這樣定義:

y-m-d h:m:s.m | -y-m-d h:m:s.m

說明:要加減的日期字元輸入方式與日期字串相同。日期與時間部分用空格分隔,最前面乙個字元如果是減號(-)的話,表示做減法處理,否則做加法處理。如果日期字元只包含數字,則視為日期字元中,僅包含天的資訊。

確定了日期字元格式後,處理方法就可以這樣確定:獲取日期字元的第乙個字元,判斷處理方式,然後將要加減的日期字元按空格分拆為日期和時間兩部分,對於日期部分從低位到高位逐個擷取日期資料進行處理,對於時間從高位到低位逐個處理。

以下是實現日期的多個部分同時加減處理的使用者定義函式**:

create function f_dateadd(

@date     datetime,

@datestr   varchar(23)

)returns datetime

asbegin

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                              

endif @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

endreturn(@date)

end

ORACLE 日期加減處理

語法 numtoyminterval n char expr char expr 日期描述,可以是year和month 作用 可以將數字轉換成相應的日期單位時間 比如 numtoyminterval 1,month 表示乙個月 numtoyminterval 1,year 表示一年 月份加減 sel...

資料庫 日期加減處理

在實際的處理中,還有一種比較另類的日期加減處理,就是在指定的日期中,加上 或者減去 多個日期部分,比如將2005年3月11日,加上1年3個月11天2小時。對於這種日期的加減處理,dateadd函式的力量就顯得有點不夠。要實現多個日期部分的加減處理,最主要的就是把要加減的日期字元分解,然後根據分解的結...

mysql日期加減 MySQL日期加減函式詳解

1.addtime 為日期加上指定秒數 select addtime now 1 加1秒 2.adddate 有兩種用法,第二個引數直接填數字的話是為日期加上指定天數,填interval的話是為日期加上指定的interval時間 select adddate now 1 加1天 select add...