如何在MS SQL Server中查找两个日期(周末除外)之间的小时数

如何在MS SQL Server中查找两个日期(周末除外)之间的小时数,sql,sql-server,Sql,Sql Server,我需要找出两次约会之间的时间,周末除外。如何在MS SQL Server中执行此操作 我试过这个 CAST(( GETDATE() - [approval_date]) AS FLOAT) * 24.0 AS WorkedHours, 包括周末。试试这个 select datediff(hh, @d1, @d2) 其中@d1=date1 和@d2=date2 你的情况是这样的 select datediff(hh, GETDATE(), [approval_date]) 基于,按照此查

我需要找出两次约会之间的时间,周末除外。如何在MS SQL Server中执行此操作

我试过这个

CAST(( GETDATE() - [approval_date]) AS FLOAT) * 24.0 AS WorkedHours, 
包括周末。

试试这个

select datediff(hh, @d1, @d2)
其中@d1=date1 和@d2=date2

你的情况是这样的

 select datediff(hh, GETDATE(), [approval_date])
基于,按照此查询获取小时数

SELECT DATEDIFF(HH, @date1, @date2) - (DATEDIFF(WK, @date1, @date2) * 2) -
       CASE WHEN datepart(DW, @d1) = 1 THEN 24 ELSE 0 END +
       CASE WHEN datepart(DW, @d2) = 1 THEN 24 ELSE 0 END

这是一个老帖子,但它可能会帮助一些人。此查询返回两个日期之间的确切日期、月份和小时,不包括所有星期日和星期六:

SELECT(DATEDIFF(分钟,@d1,@d2)-DATEDIFF(周,@d1,@d2)*2880+
案例

当DATEDIFF(WK,@d1,@d2)=1和DATEDIFF(DW,@d1,@d2)不幸的是,这并不像我想象的那样直接

我以博客/教程为基础,从那里开始工作

这是我现在使用的标量函数。我做了一些烟雾测试,它似乎工作得很好。如果您发现任何错误,请告诉我,以便我可以根据需要测试和更新解决方案。我希望这能帮助别人

ALTER FUNCTION [dbo].[GetWeekDayHoursDiff](@DateFrom datetime, @DateTo datetime)
RETURNS INT 

AS
BEGIN 

IF @DateFrom > @DateTo  
BEGIN
    return CAST('DateFrom cannot be lower thant DateTo parameters' as int);  -- https://www.youtube.com/watch?v=2ZIpFytCSVc
END 

DECLARE @TotHours INT= DATEDIFF(Hour, @DateFrom, @DateTo);
DECLARE @TotWeekHours INT= DATEDIFF(WEEK, @DateFrom, @DateTo) * 48;
DECLARE @SundayOffset INT= CASE
                     WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday' THEN  24 - DATEPART(HOUR, @DateFrom)
                     WHEN DATENAME(WEEKDAY, @DateFrom) = 'Saturday' THEN - (DATEPART(HOUR, @DateFrom))
                     ELSE 0
                  END;
DECLARE @SaturdayOffset INT= CASE
                       WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday' THEN - DATEPART(HOUR, @DateTo)
                       WHEN DATENAME(WEEKDAY, @DateTo) = 'Sunday' THEN  - DATEPART(HOUR, @DateTo) + 24
                       ELSE 0
                    END;


DECLARE @TotWorkingHours INT= @TotHours - @TotWeekHours - @SundayOffset + @SaturdayOffset;

   -- select @TotWorkingHours TotWorkingHours
      --   , @TotHours TotHours
         --, @TotWeekHours TotWWeekHours
         --, @SundayOffset SundayOffset
         --, @SaturdayOffset SaturdayOffset

RETURN @TotWorkingHours


END

可能重复的可能重复的可能重复的在发布问题之前,我已经尝试了所有答案,这些答案给天,如果我乘以24小时,将得到天*24,我没有得到确切的小时数,在一天内可能是10小时,也必须让你知道,我尝试使用以下参数运行该函数,但它没有返回预期结果。预期为12,实际为1 DateFrom DATETIME='2020-03-06 12:00:00'DateTO DATETIME='2020-03-08 13:00:00'类型VARCHAR(50)='小时'
CREATE FUNCTION [dbo].[fn_GetBusinnessDaysTimeSpan]( 
 @DateFrom DATETIME,
 @DateTO DATETIME,
 @Type VARCHAR(50)
) 
RETURNS BIGINT
AS 
BEGIN 
        DECLARE @result AS BIGINT;
        IF @Type = 'Min'
        BEGIN
            SET @result = (SELECT  (DATEDIFF(MINUTE, @DateFrom, @DateTO) -  DATEDIFF(WK, @DateFrom, @DateTO) * 2880) + 
                            CASE 
                                WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 1 AND (DATEDIFF(DW, @DateFrom, @DateTO)) <= 5 THEN 0 
                                WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 0 THEN 0 
                            ELSE 1440 END
                            )
        END

        IF @Type = 'Hour'
        BEGIN
            SET @result = (SELECT (DATEDIFF(HOUR, @DateFrom, @DateTO) - DATEDIFF(WK, @DateFrom, @DateTO) * 48) + 
                CASE 
                    WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 1 AND (DATEDIFF(DW, @DateFrom, @DateTO)) <=5 THEN 0  
                    WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 0 THEN 0 
                ELSE 24 END
                )
        END

        IF @Type = 'Day'
        BEGIN
            SET @result = (SELECT (DATEDIFF(DW, @DateFrom, @DateTO) - DATEDIFF(WK, @DateFrom, @DateTO) * 2) + 
                            CASE 
                                WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 1 AND (DATEDIFF(DW, @DateFrom, @DateTO)) <=5 THEN 0  
                                WHEN  DATEDIFF(WK, @DateFrom, @DateTO) = 0 THEN 0 
                            ELSE 1 END
                            )
        END
        RETURN @result 
END
ALTER FUNCTION [dbo].[GetWeekDayHoursDiff](@DateFrom datetime, @DateTo datetime)
RETURNS INT 

AS
BEGIN 

IF @DateFrom > @DateTo  
BEGIN
    return CAST('DateFrom cannot be lower thant DateTo parameters' as int);  -- https://www.youtube.com/watch?v=2ZIpFytCSVc
END 

DECLARE @TotHours INT= DATEDIFF(Hour, @DateFrom, @DateTo);
DECLARE @TotWeekHours INT= DATEDIFF(WEEK, @DateFrom, @DateTo) * 48;
DECLARE @SundayOffset INT= CASE
                     WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday' THEN  24 - DATEPART(HOUR, @DateFrom)
                     WHEN DATENAME(WEEKDAY, @DateFrom) = 'Saturday' THEN - (DATEPART(HOUR, @DateFrom))
                     ELSE 0
                  END;
DECLARE @SaturdayOffset INT= CASE
                       WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday' THEN - DATEPART(HOUR, @DateTo)
                       WHEN DATENAME(WEEKDAY, @DateTo) = 'Sunday' THEN  - DATEPART(HOUR, @DateTo) + 24
                       ELSE 0
                    END;


DECLARE @TotWorkingHours INT= @TotHours - @TotWeekHours - @SundayOffset + @SaturdayOffset;

   -- select @TotWorkingHours TotWorkingHours
      --   , @TotHours TotHours
         --, @TotWeekHours TotWWeekHours
         --, @SundayOffset SundayOffset
         --, @SaturdayOffset SaturdayOffset

RETURN @TotWorkingHours


END