日期加減處理
對於日期指定部分的加減,使用
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...