如何获取 SQL 服务器中两个日期之间的小时数?
How to get hours between two dates in SQL Server?
我有两个日期 2019-01-02 12:33:36.000
和 2019-01-09 19:05:18.000
我想计算除星期六和星期日之外的两者之间的小时和分钟。我可以计算出差异,但不确定如何从计算中排除星期六和星期日。
没有要排除的工作时间,只是周六到周日的上午 12 点到中午 12 点需要排除,我使用的是 SQL Server 2008。
我正在使用 SQL Server 2008
Edit -- From the comments suggestions I have this to calculate weekends
..DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-01-02 12:33:36.000'
SET @EndDate = '2019-01-09 19:05:18.000'
SELECT
(DATEDIFF(wk, @StartDate, @EndDate) * 2)
+(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
+(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
现在我只计算分钟数并从总计中减去。
所以在从 David 那里得到一些建议后,这是我的最终代码,它让我得到两个日期之间的分钟数,不包括周末
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-03-07 00:00:00.000'
SET @EndDate = '2019-03-11 23:59:59.000'
Declare @TotalMins int
Declare @Weekends int
Declare @FinalMinutes int
Set @TotalMins = DATEDIFF(MINUTE, @StartDate,@EndDate);
Set @Weekends =
(DATEDIFF(wk, @StartDate, @EndDate) * 2)
+(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
+(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
Set @FinalMinutes = @TotalMins - (@Weekends * 24 * 60)
Select @FinalMinutes
谢谢
使用函数对两个日期之间的每一分钟 return table date/times 然后从结果中排除周末并将计数转换为小时和分钟;
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-03-07 00:00:00.000'
SET @EndDate = '2019-03-11 23:59:59.000'
SELECT COUNT([Start_Date])/60 as 'Hours'
, COUNT([Start_Date])%60 as 'Minutes'
FROM dbo.generateDateTable(@StartDate, @EndDate, 'minute',1)
WHERE DATENAME(DW, [Start_Date]) NOT IN ('Saturday','Sunday')
方便的 GenerateDateTable 函数;
CREATE function [dbo].[generateDateTable]
(
@start_date datetime
, @end_date datetime
, @datepart varchar(20) = 'day'
, @step int = 1
)
returns @dates table
(
start_date datetime,
end_date datetime
)
as
begin
if( @datepart in ('year', 'yy', 'yyyy', 'quarter', 'qq', 'q', 'month', 'mm', 'm',
'dayofyear', 'dy', 'y', 'day', 'dd', 'd', 'week', 'wk', 'ww') )
begin
set @start_date = cast(floor(cast(@start_date as float)) as datetime)
set @end_date = cast(floor(cast(@end_date as float)) as datetime)
end
declare @new_start datetime
while @start_date <= @end_date
begin
set @new_start = (case
when @datepart in ('year', 'yy', 'yyyy') then dateadd(yy, @step, @start_date)
when @datepart in ('quarter', 'qq', 'q') then dateadd(qq, @step, @start_date)
when @datepart in ('month', 'mm', 'm') then dateadd(mm, @step, @start_date)
when @datepart in ('dayofyear', 'dy', 'y') then dateadd(dy, @step,
@start_date)
when @datepart in ('day', 'dd', 'd') then dateadd(dd, @step, @start_date)
when @datepart in ('week', 'wk', 'ww') then dateadd(ww, @step, @start_date)
when @datepart in ('hour', 'hh') then dateadd(hh, @step, @start_date)
when @datepart in ('minute', 'mi', 'n') then dateadd(n, @step, @start_date)
when @datepart in ('second', 'ss', 's') then dateadd(s, @step, @start_date)
when @datepart in ('millisecond', 'ms') then dateadd(ms, @step, @start_date)
else dateadd(dd, @step, @start_date)
end)
insert
@dates
(
start_date
, end_date
) values (
@start_date
, dateadd(ms, -3, @new_start)
)
set @start_date = @new_start
end
return
end
我有两个日期 2019-01-02 12:33:36.000
和 2019-01-09 19:05:18.000
我想计算除星期六和星期日之外的两者之间的小时和分钟。我可以计算出差异,但不确定如何从计算中排除星期六和星期日。
没有要排除的工作时间,只是周六到周日的上午 12 点到中午 12 点需要排除,我使用的是 SQL Server 2008。
我正在使用 SQL Server 2008
Edit -- From the comments suggestions I have this to calculate weekends
..DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-01-02 12:33:36.000'
SET @EndDate = '2019-01-09 19:05:18.000'
SELECT
(DATEDIFF(wk, @StartDate, @EndDate) * 2)
+(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
+(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
现在我只计算分钟数并从总计中减去。
所以在从 David 那里得到一些建议后,这是我的最终代码,它让我得到两个日期之间的分钟数,不包括周末
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-03-07 00:00:00.000'
SET @EndDate = '2019-03-11 23:59:59.000'
Declare @TotalMins int
Declare @Weekends int
Declare @FinalMinutes int
Set @TotalMins = DATEDIFF(MINUTE, @StartDate,@EndDate);
Set @Weekends =
(DATEDIFF(wk, @StartDate, @EndDate) * 2)
+(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
+(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
Set @FinalMinutes = @TotalMins - (@Weekends * 24 * 60)
Select @FinalMinutes
谢谢
使用函数对两个日期之间的每一分钟 return table date/times 然后从结果中排除周末并将计数转换为小时和分钟;
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2019-03-07 00:00:00.000'
SET @EndDate = '2019-03-11 23:59:59.000'
SELECT COUNT([Start_Date])/60 as 'Hours'
, COUNT([Start_Date])%60 as 'Minutes'
FROM dbo.generateDateTable(@StartDate, @EndDate, 'minute',1)
WHERE DATENAME(DW, [Start_Date]) NOT IN ('Saturday','Sunday')
方便的 GenerateDateTable 函数;
CREATE function [dbo].[generateDateTable]
(
@start_date datetime
, @end_date datetime
, @datepart varchar(20) = 'day'
, @step int = 1
)
returns @dates table
(
start_date datetime,
end_date datetime
)
as
begin
if( @datepart in ('year', 'yy', 'yyyy', 'quarter', 'qq', 'q', 'month', 'mm', 'm',
'dayofyear', 'dy', 'y', 'day', 'dd', 'd', 'week', 'wk', 'ww') )
begin
set @start_date = cast(floor(cast(@start_date as float)) as datetime)
set @end_date = cast(floor(cast(@end_date as float)) as datetime)
end
declare @new_start datetime
while @start_date <= @end_date
begin
set @new_start = (case
when @datepart in ('year', 'yy', 'yyyy') then dateadd(yy, @step, @start_date)
when @datepart in ('quarter', 'qq', 'q') then dateadd(qq, @step, @start_date)
when @datepart in ('month', 'mm', 'm') then dateadd(mm, @step, @start_date)
when @datepart in ('dayofyear', 'dy', 'y') then dateadd(dy, @step,
@start_date)
when @datepart in ('day', 'dd', 'd') then dateadd(dd, @step, @start_date)
when @datepart in ('week', 'wk', 'ww') then dateadd(ww, @step, @start_date)
when @datepart in ('hour', 'hh') then dateadd(hh, @step, @start_date)
when @datepart in ('minute', 'mi', 'n') then dateadd(n, @step, @start_date)
when @datepart in ('second', 'ss', 's') then dateadd(s, @step, @start_date)
when @datepart in ('millisecond', 'ms') then dateadd(ms, @step, @start_date)
else dateadd(dd, @step, @start_date)
end)
insert
@dates
(
start_date
, end_date
) values (
@start_date
, dateadd(ms, -3, @new_start)
)
set @start_date = @new_start
end
return
end