Sql 如何根据条件扣除小时数

Sql 如何根据条件扣除小时数,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,使用SQL Server 表1 ID, MinTime, TotalTime, BreakTime 001, 04:00:00, 12:00:00, 00:30:00 002, 04:00:00, 03:00:00, 00:30:00 003, 08:00:00, 07:30:00, 03:30:00 004, 04:00:00, 03:59:59, 01:30:00 当totaltime>mintime时,我想扣除totaltime中断时间 Condtion: If Totaltime

使用SQL Server

表1

ID, MinTime, TotalTime, BreakTime

001, 04:00:00, 12:00:00, 00:30:00
002, 04:00:00, 03:00:00, 00:30:00
003, 08:00:00, 07:30:00, 03:30:00
004, 04:00:00, 03:59:59, 01:30:00

当totaltime>mintime时,我想扣除totaltime中断时间

Condtion:

If Totaltime is greater than mintime then it should deduct the total hours, but it should Maintain the  MinTime
例如:

Min time: 05:00:00
Total Time: 06:00:00
BreakTime: 01:30:00
总时间大于最小时间,因此我们可以设置(totaltime Breaktime),它将给出类似“04:30:00”的输出(不正确,因为它还应保持最小时间,因此它应仅从中断时间中扣除1小时)

预期产量

ID, MinTime, TotalTime, BreakTime DeductTime

001, 04:00:00, 12:00:00, 00:30:00 11:30:00 (TotalTime is Greater than mintime)
002, 04:00:00, 04:35:00, 01:00:00 04:00:00 (`Here TotalTime is greather than mintime, so it should deduct the breaktime from the total hours, but it should maintain the mintime also)`
003, 08:00:00, 07:30:00, 03:30:00 07:30:00 (TotalTime is less than mintime)
004, 04:00:00, 03:59:59, 01:30:00 03:59:59 (TotalTime is less than mintime)
如何查询上述条件

需要查询帮助

您可以使用语句

SELECT  ID
        , MinTime
        , TotalTime
        , BreakTime
        , CASE WHEN TotalTime < MinTime THEN TotalTime
               WHEN TotalTime - BreakTime < MinTime THEN MinTime
               ELSE TotalTime
          END AS DeductTime
FROM    Table1
选择ID
,分钟
,总时间
,休息时间
,当TotalTime
案例(Transact-SQL)
计算条件和条件的列表 返回多个可能值中的一个 结果表达式


如果您的数据类型不是datetime,而是nvarchar,请参阅以下回复:


尝试使用用户定义的函数

create function GetTotalHours (@BreakTime datetime,@Totaltime datetime, @MinTime DateTime) returns datetime
as
begin
declare @newTotalTime datetime;
declare @DiffenceInHours int;
set @DiffenceInHours = datediff(HH,@BreakTime,@Totaltime);

if @Totaltime >@MinTime
    begin --If Totaltime is greater than mintime then it should deduct the total hours
        set @newTotalTime=dateDiff(HH,@DiffenceInHours,@Totaltime);
    end
else
    begin--If totaltime is smaller than mintime then it should not deduct the total hours
        set @newTotalTime=@Totaltime;
    end

return @newTotalTime ;
end
go
然后使用udf从您的表中进行选择,如下所示

select dbo.GetTotalHours('2011-02-03 14:51:48.620',
    '2011-02-03 11:51:48.620','2011-02-03 11:51:48.620')
from  [YourSourceTable]

你的例子有些前后矛盾。最后三行上的
TotalTime
小于
MinTime
,但最后一行显示
DeductTime=04:00:00=MinTime
,而其他两行上的
DeductTime=TotalTime
。此外,时间值使用的数据类型是什么?显示的时间是数量,而不是时间戳,因此基本上他需要执行条件减法,这是Lieven提出的路线。根据OP最近提出的大量问题,只有OP的日期/时间数据倾向于nvarchar类型。OP总是忘记提到这一事实,也总是被提醒着。@Andrey M:看看OP的历史,他确实在延伸它。看来他自己根本没办法找到答案。谢谢你的回答,我修改了我的问题。你能看看吗please@Liven,谢谢你的回答,我修改了我的问题。你能看看吗please@Gopal:我已经编辑了答案,但如果你自己更加努力地寻找解决方案,从长远来看会为你提供更好的服务(顺便说一句,这是Lieven,而不是liven)。人们希望我花时间回答他们不会花时间问的问题,这总是让我感到惊讶。(乔治)