如何在MS SQL Server中查找两个日期(周末除外)之间的小时数
我需要找出两次约会之间的时间,周末除外。如何在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]) 基于,按照此查
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