2017-04-05 76 views
2
declare @startTime datetime 
,@endTime datetime 
, @IntervalIncWeekends int ; 
set @startTime = '03/13/2017 11:00:02' 
set @endTime = '03/30/2017 19:53:59' 
IF DATENAME(dw, @startTime) = 'Saturday' 
SET @startTime = CAST(CAST(DATEADD(dd,2,@startTime) AS DATE) AS 
DATETIME); 
IF   DATENAME(dw, @startTime) = 'Sunday' 
SET @startTime = CAST(CAST(DATEADD(dd,1,@startTime) AS DATE) AS 
DATETIME); 
IF DATENAME(DW, @endTime) = 'Saturday' 
SET @endTime = DATEADD(MI,-1, CAST(CAST(@endTime AS DATE) 
AS DATETIME)); 
IF DATENAME(DW, @endTime) = 'Sunday' 
SET @endTime = DATEADD(MI,-1, CAST(CAST(DATEADD(dd,-1,@endTime) AS 
DATE) AS DATETIME)); 

IF @endTime <= @startTime 
BEGIN 
    SELECT 0; 
END 
ELSE 
BEGIN 
DECLARE  @NumberofWeekendDays decimal(5,2) = 0; 
;WITH cte as (
    SELECT CAST(DATEADD(DD,1,@startTime) AS DATE) AS dt 
          WHERE DATEADD(DD,1,@startTime) < @endTime 
          UNION ALL 
          SELECT DATEADD(DD,1,dt) 
          FROM cte 
          WHERE DATEADD(DD,1,dt) < @endTime 
      ) 
       SELECT @NumberofWeekendDays = COUNT(*) 
       FROM cte 
       WHERE DATENAME(dw, dt) IN ('Saturday','Sunday'); 
          SELECT ((DATEDIFF(MI,@startTime,@endTime) - 
(@NumberofWeekendDays * 60 * 24))/60)/24 m; 
    END 

如何我可以改变这一个SQL函数,这样我可以通过2个日期为参数的功能,并获得回报的时间插入?如何将此代码更改为SQL 2012函数?

+1

是不是只是一个基本的标量函数?你真的尝试过什么吗?至少你应该尝试格式化你的代码更好... –

+2

[坏习惯踢:使用速记日期/时间的操作 - 伯特兰·亚伦(http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/ 20 /坏习惯,对开球使用-速记与 - 日期 - 时间 - operations.aspx) – SqlZim

回答

1

这里是一个可以变成一个表值Funcion甚至标量值函数的一个选项。我强烈的推荐是TVF。

你也有节假日除外的附加选项。 (目前列为值,但也可以是表格)。

示例对于一个快速测试

Declare @D1 datetime ='2017-03-13 11:00:02' 
Declare @D2 datetime ='2017-03-30 19:53:59' 

Select Count(*)/60.0/24.0 
From (
     Select Top (DateDiff(MINUTE,@D1,@D2)) 
       D=DateAdd(MINUTE,-1+Row_Number() Over (Order By (Select NULL)),@D1) 
     From master..spt_values N1,master..spt_values N2 
     ) N 
Where Datename(WeekDay,D) Not In ('Saturday','Sunday') 
    and D Not In ('2016-01-01' -- New Year's Day 
       ,'2016-01-18' -- Martin Luther King, Jr, 
       ,'2016-02-15' -- Washington''s Birthday 
       ,'2016-03-25' -- Good Friday 
       ,'2016-05-30' -- Memorial Day 
       ,'2016-07-04' -- Independence Day 
       ,'2016-09-05' -- Labor Day 
       ,'2016-11-24' -- Thanksgiving 
       ,'2016-11-25' -- Black Friday 
       ,'2016-12-26' -- Christmas Day 
       ) 

返回

13.370138875 

编辑 - 如果感兴趣,只是为了好玩 - 两大功能TVF和SVF

表值,功能

CREATE FUNCTION [dbo].[MyFunctionTV] (@D1 datetime,@D2 datetime) 
Returns Table 
As 
Return ( 

Select Value = Count(*)/60.0/24.0 
From (
     Select Top (DateDiff(MINUTE,@D1,@D2)) 
       D=DateAdd(MINUTE,-1+Row_Number() Over (Order By (Select NULL)),@D1) 
      From master..spt_values N1,master..spt_values N2 
     ) N 
Where Datename(WeekDay,D) Not In ('Saturday','Sunday') 
    and D Not In ('2016-01-01' -- New Year's Day 
       ,'2016-01-18' -- Martin Luther King, Jr, 
       ,'2016-02-15' -- Washington''s Birthday 
       ,'2016-03-25' -- Good Friday 
       ,'2016-05-30' -- Memorial Day 
       ,'2016-07-04' -- Independence Day 
       ,'2016-09-05' -- Labor Day 
       ,'2016-11-24' -- Thanksgiving 
       ,'2016-11-25' -- Black Friday 
       ,'2016-12-26' -- Christmas Day 
       ) 
) 
-- Goal : 13.370138875 
-- Select * from [dbo].[MyFunctionTV]('2017-03-13 11:00:02','2017-03-30 19:53:59') 

标量值,功能

CREATE FUNCTION [dbo].[MyFunctionSV] (@D1 datetime,@D2 datetime) 
Returns float 
As 
Begin 
Return ( 

Select Count(*)/60.0/24.0 
From (
     Select Top (DateDiff(MINUTE,@D1,@D2)) 
       D=DateAdd(MINUTE,-1+Row_Number() Over (Order By (Select NULL)),@D1) 
      From master..spt_values N1,master..spt_values N2 
     ) N 
Where Datename(WeekDay,D) Not In ('Saturday','Sunday') 
    and D Not In ('2016-01-01' -- New Year's Day 
       ,'2016-01-18' -- Martin Luther King, Jr, 
       ,'2016-02-15' -- Washington''s Birthday 
       ,'2016-03-25' -- Good Friday 
       ,'2016-05-30' -- Memorial Day 
       ,'2016-07-04' -- Independence Day 
       ,'2016-09-05' -- Labor Day 
       ,'2016-11-24' -- Thanksgiving 
       ,'2016-11-25' -- Black Friday 
       ,'2016-12-26' -- Christmas Day 
       ) 
) 
End 
-- Goal : 13.370138875 
-- Select [dbo].[MyFunctionSV]('2017-03-13 11:00:02','2017-03-30 19:53:59') 
+0

今天是什么日子圣诞节一遍吗? – SqlZim

+0

@SqlZim在2016年它在26个观察 - 银行 –

+0

唉唉是有道理的。 – SqlZim