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)