SQL常用自定义函数

--************************************将数字年月日变换成中文
 
CREATE FUNCTION ymdseq
(@ymd datetime)
RETURNS varchar(24)
AS
BEGIN
declare @x varchar(2),@y varchar(2),@yy varchar(4),@dd varchar(6),@z varchar(2),@e varchar(2),@r varchar(2),@t varchar(2)
 
set @e=case when left(datepart(year,@ymd),1)='1' then '一'   when left(datepart(year,@ymd),1)='2' then '二'   when left(datepart(year,@ymd),1)='3' then '三'   when left(datepart(year,@ymd),1)='4' then '四' 
                       when left(datepart(year,@ymd),1)='5' then '五'   when left(datepart(year,@ymd),1)='6' then '六'   when left(datepart(year,@ymd),1)='7' then '七'   when left(datepart(year,@ymd),1)='8' then  '八' 
                       when left(datepart(year,@ymd),1)='9'  then '九' end
 
set @z=case when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='1' then '一'   when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='2' then '二'   when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='3' then '三'   when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='4' then '四' 
                       when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='5' then '五'   when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='6' then '六'   when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='7' then '七'   when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='8' then  '八' 
                       when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='9'   then '九' when substring(cast(datepart(year,@ymd) as varchar(4)),2,1)='0' then '零'  end
 
set @r=case when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='1' then '一'   when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='2' then '二'   when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='3' then '三'   when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='4' then '四' 
                       when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='5' then '五'   when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='6' then '六'   when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='7' then '七'   when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='8' then  '八' 
                       when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='9'   then '九' when substring(cast(datepart(year,@ymd) as varchar(4)),3,1)='0' then '零'   end
 
set @t=case when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='1' then '一'   when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='2' then '二'   when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='3' then '三'   when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='4' then '四' 
                       when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='5' then '五'   when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='6' then '六'   when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='7' then '七'   when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='8' then  '八' 
                       when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='9'   then '九' when substring(cast(datepart(year,@ymd) as varchar(4)),4,1)='0' then '零'   end
 
 
 
set @x=case when datepart(mm,@ymd) <10 then '0'+cast(datepart(mm,@ymd) as varchar(2))
else  cast(datepart(mm,@ymd) as varchar(2)) end
 
set @yy=case when @x='01' then '一'  when @x='02' then '二'  when @x='03' then '三'  when @x='04' then '四'  when @x='05' then '五'  when @x='06' then '六'  when @x='07' then '七'
                        when @x='08' then '八'  when @x='09' then '九'  when @x='10' then '十'  when @x='11' then '十一'  when @x='12' then '十二' end
 
set @y=case when datepart(day,@ymd) <10 then '0'+cast(datepart(day,@ymd) as varchar(2))
else  cast(datepart(day,@ymd) as varchar(2)) end
 
set @dd=case when @y='01' then '一'  when @y='02' then '二'  when @y='03' then '三'  when @y='04' then '四'  when @y='05' then '五'  when @y='06' then '六'  when @y='07' then '七'
                        when @y='08' then '八'  when @y='09' then '九'  when @y='10' then '十'  when @y='11' then '十一'  when @y='12' then '十二'   when @y='13' then '十三'   when @y='13' then '十三'  
                          when @y='14' then '十四'   when @y='15' then '十五'   when @y='16' then '十六'   when @y='17' then '十七'   when @y='18' then '十八'   when @y='19' then '十九'   when @y='20' then '二十'
                          when @y='21' then  '二十一'  when @y='22' then  '二十二'   when @y='23' then  '二十三'   when @y='24' then '二十四'   when @y='25' then '二十五'   when @y='26' then '二十六'   when @y='27' then '二十七'
                         when @y='28' then '二十八'   when @y='29' then '二十九'   when @y='30' then '三十'    when @y='31' then '三十一' 
end
 

RETURN 
@e+@z+@r+@t+'年'+@yy+'月'+@dd+'日'
END
 

--**********************************将日期转化为'2007-7-1' 的格式
CREATE FUNCTION dat1
(@ymd datetime)
RETURNS varchar(13)
AS
BEGIN
RETURN CAST(YEAR(@ymd) AS varchar) +'-'+case when month(@ymd)<10 then '0'+CAST(month(@ymd) AS varchar) 
else CAST(month(@ymd) AS varchar) end
 + '-' +case when DAY(@ymd)<10 then '0'+CAST(DAY(@ymd) AS varchar) 
else CAST(DAY(@ymd) AS varchar) end 
END
 

--**********************************取每个没字的拼音第一个字母**********************************
create function fun_getPY(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @word nchar(1),@PY nvarchar(4000)
set @PY=''
while len(@str)>0
begin
set @word=left(@str,1)
--如果非汉字字符,返回原字符
set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
then (select top 1 PY from (
select 'A' as PY,N'驁' as word
union all select 'B',N'簿'
union all select 'C',N'錯'
union all select 'D',N'鵽'
union all select 'E',N'樲'
union all select 'F',N'鰒'
union all select 'G',N'腂'
union all select 'H',N'夻'
union all select 'J',N'攈'
union all select 'K',N'穒'
union all select 'L',N'鱳'
union all select 'M',N'旀'
union all select 'N',N'桛'
union all select 'O',N'漚'
union all select 'P',N'曝'
union all select 'Q',N'囕'
union all select 'R',N'鶸'
union all select 'S',N'蜶'
union all select 'T',N'籜'
union all select 'W',N'鶩'
union all select 'X',N'鑂'
union all select 'Y',N'韻'
union all select 'Z',N'咗'
) T 
where word>=@word collate Chinese_PRC_CS_AS_KS_WS 
order by PY ASC) else @word end)
set @str=right(@str,len(@str)-1)
end
return @PY
end
 

--**********************************格式为'200707'的月份减一**********************************
CREATE FUNCTION GZ_YM
(@GZ_YM VARCHAR(6))
RETURNS varchar(6)
AS
BEGIN
return
case when RIGHT(@GZ_YM,2)='01' then CAST(LEFT(@GZ_YM,4)-1 AS VARCHAR(4))+'12'
else  @GZ_YM-1 end
 
END
 

--**********************************格式为'200707'的月份加一**********************************
CREATE FUNCTION GZ_YMj
(@GZ_YM VARCHAR(6))
RETURNS varchar(6)
AS
BEGIN
return
case when RIGHT(@GZ_YM,2)='12' then CAST(LEFT(@GZ_YM,4)+1 AS VARCHAR(4))+'01'
else  @GZ_YM+1 end
 
END
 
--**********************************将时间转换为'08:11'**********************************
CREATE FUNCTION tim
(@ymd datetime)
RETURNS varchar(13)
AS
BEGIN
declare @x varchar(2)
set @x=case when datepart(mi,@ymd) <10 then '0'+cast(datepart(mi,@ymd) as varchar(2))
else  cast(datepart(mi,@ymd) as varchar(2)) end
RETURN 
case when @ymd is null
then ''
else
cast(datepart(hh,@ymd) as varchar(2))+':'+@x
end
END
 
--**********************************将'2007-5-1'的格式转换为'200705'**********************************
CREATE FUNCTION ym
(@ymd datetime)
RETURNS varchar(13)
AS
BEGIN
RETURN CAST(YEAR(@ymd) AS varchar)+case when month(@ymd)<10 then '0'+CAST(month(@ymd) AS varchar) 
else CAST(month(@ymd) AS varchar) end
 
 
END
 

--**********************************将日期为15号之前的转换为上月,15号之后的转换为下月**********************************
CREATE FUNCTION ym15
(@ymd datetime)
RETURNS varchar(13)
AS
BEGIN
return case when datepart(day,@ymd)<=15 then dbo.ym(@ymd) else  
                                                             case when datepart(month,@ymd)=12  then cast(cast(datepart(year,dateadd(year,1,@ymd)) as varchar(4))+cast('01' as varchar(2))  as varchar(6))
                                                                    else cast(cast(datepart(year,@ymd) as varchar(4))+cast(dateadd(month,1,@ymd) as varchar(2)) as varchar(6)) end end
 
 
END
 

--**********************************将'2007-12-10'的格式转换为'20071201'**********************************
CREATE FUNCTION ymd
(@ymd datetime)
RETURNS varchar(8)
AS
BEGIN
declare @x varchar(2),@y varchar(2)
 
set @x=case when datepart(mm,@ymd) <10 then '0'+cast(datepart(mm,@ymd) as varchar(2))
else  cast(datepart(mm,@ymd) as varchar(2)) end
 
set @y=case when datepart(day,@ymd) <10 then '0'+cast(datepart(day,@ymd) as varchar(2))
else  cast(datepart(day,@ymd) as varchar(2)) end
 

RETURN 
cast(datepart(yyyy,@ymd) as varchar(4))+@x+@y
END
 
--**********************************将'20071201' 的格式转换为'2007-12-01'**********************************
CREATE FUNCTION ymdate
(@ym varchar(8))
 
RETURNS datetime
 
AS
 
BEGIN
declare @x varchar(4),@y varchar(2),@z varchar(2),@d datetime
 
set @x=left(@ym,4)
set @y=substring(@ym,5,2)
set @z=right(@ym,2)
 
set @d=cast(@x+'-'+@y+'-'+@z as datetime)
return
@d
END
 

--**********************************当月除休息日设置 的天数**********************************
CREATE FUNCTION ymday
(@ym varchar(6))
RETURNS int
AS
BEGIN
declare @x int,@startd datetime,@endd datetime,@y int,@z int
set @x=case when right(@ym,2)='01' then 31
            when right(@ym,2)='02' then
               case when (left(@ym,4) % 4 = 0) and ((left(@ym,4) % 100 <> 0) or (left(@ym,4) % 400 = 0))
                    then 29
               else 28
            end 
            when right(@ym,2)='03' then 31
            when right(@ym,2)='04' then 30
            when right(@ym,2)='05' then 31
            when right(@ym,2)='06' then 30
            when right(@ym,2)='07' then 31
            when right(@ym,2)='08' then 31
            when right(@ym,2)='09' then 30
            when right(@ym,2)='10' then 31
            when right(@ym,2)='11' then 30
            when right(@ym,2)='12' then 31
else 0
end
 
set @startd=cast(cast(left(@ym,4) as varchar(4))+'-'+cast(right(@ym,2) as varchar(2))+'-1' as datetime)
set @endd=cast(cast(left(@ym,4) as varchar(4))+'-'+cast(right(@ym,2) as varchar(2))+'-'+cast(@x as varchar(2)) as datetime)
 
set @y=0
 
while @startd<=@endd
begin
set @y=@y+case when datepart(weekday,@startd) in(7,1) then 1
                else 0 end
set @startd=dateadd(dd,1,@startd)
end
set @z= @x-@y
return
@z
END
 

--**********************************将'2007-12-01' 转换为'2007年12月01日'**********************************
CREATE FUNCTION ymdse
(@ymd datetime)
RETURNS varchar(20)
AS
BEGIN
declare @x varchar(2),@y varchar(2)
 
set @x=case when datepart(mm,@ymd) <10 then '0'+cast(datepart(mm,@ymd) as varchar(2))
else  cast(datepart(mm,@ymd) as varchar(2)) end
 
set @y=case when datepart(day,@ymd) <10 then '0'+cast(datepart(day,@ymd) as varchar(2))
else  cast(datepart(day,@ymd) as varchar(2)) end
 

RETURN 
cast(datepart(yyyy,@ymd) as varchar(4))+'年'+@x+'月'+@y+'日'
END
 
--**********************************将时间'0800' 转换为日期形式'1900-1-1 08:00:00.000'
CREATE FUNCTION ymtime
(@ym varchar(4))
 
RETURNS datetime
 
AS
 
BEGIN
declare @x varchar(2),@y varchar(2),@z varchar(2),@d datetime
 
set @x=left(@ym,2)
set @z=right(@ym,2)
 
set @d=cast('1900-1-1 '+@x+':'+@z as datetime)
return
@d
END

  

原文地址:https://www.cnblogs.com/xiaofengfeng/p/2530907.html