sqlserver 时间格式函数详细

--getdate 获取当前时间
 select getdate()
 
 --dateadd 原有时间加: 2013-02-17 13:20:16 此时间加12个月 
 select dateadd(MONTH,12,'2013-02-17 13:20:16')  --返回:2014-02-17 13:20:16.000  (参数month可以改为 day,year等日期加相应的值)
 
 --datediff 两个时间的差 (后面-前面=返回值)
 select datediff(day,'2013-02-01','2013-02-18')   --返回:17  (参数day可以改为 month,year等日期加相应的值)
 
 --datepart 获取日期的某个部分整数
 select DATEPART(month, '2013-2-17')  --返回 2    (参数month可以改为 day,year等日期加相应的值)
 
 --datename 获取指定部位的字符串
 select datename(weekday, '2013-2-17')  --返回 星期日 (参数weekday可以改为 day,year等日期加相应的值)

 --day(), month(),year() 获取指定部位的字符串
 select day('2013-2-15') --返回15

   select CONVERT(varchar, getdate(), 120 )  --返回 2013-02-17 13:37:54

    select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','') --返回 20130217133828

    select CONVERT(varchar(12) , getdate(), 111 )  --返回 2013/02/17

    select CONVERT(varchar(12) , getdate(), 112 )  --返回 20130217

    select CONVERT(varchar(12) , getdate(), 102 )  --返回 2013.02.17

    select CONVERT(varchar(12) , getdate(), 101 )  --返回 02/17/2013

    select CONVERT(varchar(12) , getdate(), 103 )  --返回 17/02/2013

    select CONVERT(varchar(12) , getdate(), 104 )  --返回 17.02.2013

    select CONVERT(varchar(12) , getdate(), 105 )  --返回 17-02-2013

    select CONVERT(varchar(12) , getdate(), 106 )  --返回 17 02 2013

    select CONVERT(varchar(12) , getdate(), 107 )  --返回 02 17, 2013

    select CONVERT(varchar(12) , getdate(), 108 )  --返回 13:42:50

    select CONVERT(varchar(12) , getdate(), 109 )  --返回 02 17 2013  

    select CONVERT(varchar(12) , getdate(), 110 )  --返回 02-17-2013

    select CONVERT(varchar(12) , getdate(), 113 )  --返回 17 02 2013 1

    select CONVERT(varchar(12) , getdate(), 114 )  --返回 13:42:24:743


一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日),节假日在 holidays 表中维护;
1、函数

--创建函数,参数 @bengrq 开始时间,@endrq 结束时间
create function [dbo].[f_jsgzr](@bengrq date,@endrq date) 
--返回值类型 天数
returns int 
begin
--计算出开始时间与结束时间的相差的天数,通过这个天数减去查询出来的节假日与休息日天数
--@jats 节假日,@gzrts 总天数,@gzrts 返回值 工作日天数
declare @jats int,@zts int,@gzrts int 
--数据库中存在一张记录节假日与休息日的表,通过这张表合计两个时间段中包含的节假日天数
select @jats = count(1) 
from holidays rq where rq.hldys >= @bengrq and rq.hldys <= @endrq
select @zts = DATEDIFF(day,@bengrq,@endrq) 
--计算工作日 = 总天数 - 假节日天数 
select @gzrts = @zts - @jats 
--返回工作日天数
return @gzrts
end

--执行函数,输入参数
SELECT [dbo].[f_jjr] ('2019-02-11','2019-02-18')
GO


 2、存储过程
/*创建存储过程 计算工作日*/create  procedure jjr 
--参数 @bengrq 开始时间,@endrq 结束时间、@gzrts 工作日天数
@bengrq date,@endrq date,@gzrts int output as 
begin
--计算出开始时间与结束时间的相差的天数,通过这个天数减去查询出来的节假日与休息日天数
declare @jats int,@zts int  
--数据库中存在一张记录节假日与休息日的表,通过这张表合计两个时间段中包含的节假日天数
select @jats = count(1) 
from holidays rq where rq.hldys >= @bengrq and rq.hldys <= @endrq
select @zts = DATEDIFF(day,@bengrq,@endrq) 
--计算工作日 = 总天数 - 假节日天数 
select @gzrts = @zts - @jats 
print  @gzrts
--返回天数
return @gzrts
end

--声明变量
declare @bengrq date,@endrq date,@gzrts int 
--给变量赋值
select @bengrq = '2019-02-01',@endrq = '2019-03-01'
--调用存储过程
EXEC jjr @bengrq,@endrq,@gzrts output  



二、通过一个开始时间、天数计算出一个结束时间(不包含工作日与节假日);

  使用循环来实现;

/*创建函数通过工作日天数,获取结束时间*/
--@bengrq 开始时间,@gzrts 工作日天数
create function dbo.f_jsjsrq(@bengrq date,@gzrts int) 
--返回值类型 结束时间
returns date  
begin
--@jats 节假日,@addDate 返回值 结束日
declare @jats int,@endrq date 
--为 @endrq 结束时间赋值,从 @bengrq 开始时间的第二天开始
select @endrq = @bengrq --工作日天数大于0时循环查询节假日表数据
    while @gzrts >= 0
    begin
        --每次查询时 @jats 节假日等于0
        select @jats = 0
        select @jats = count(1) from holidays rq where rq.hldys = @endrq 
        if @jats > 0 
        begin
            select @endrq = dateadd(day,1,@endrq)            
        end else begin         
            --@endrq 当前日期不是节假日时工作日天数减1
            select @gzrts = @gzrts - 1    
            --当工作日天数小于0时跳出循环
            if @gzrts < 0             
            begin 
                break; 
            end 
            select @endrq = dateadd(day,1,@endrq)    
        end
    end
--返回日期
return @endrq
end

--执行函数,参数 开始时间、工作日天数
SELECT dbo.f_jsjsrq ('2019-02-01',16)
posted @ 2022-08-24 09:23  乌龙茶爱上柠檬汁  阅读(159)  评论(0编辑  收藏  举报