确定开始和结束时间在不同时间内按小时工作的分钟数

时间:2015-01-29 21:59:07

标签: sql sql-server tsql

我有两张桌子:
HourList - 在一个字段中每天的每小时:小时 LoginLogout - 有员工和登录时出来

我正在尝试从MySQL中的答案中调整代码,但是从CASE语句到timeadd转换为dateadd会遇到各种各样的问题。我真的相信这个MySQL代码正是我想要的,我只是没有把它自己转换为SQL。这是MySQL的代码...我的一团糟,不值得发帖。

select hour, userid,
case
   when login < hour and logout >= ADDTIME(hour,'1:00:00.0') then '1:00:00.0'
   when login >= hour and logout < ADDTIME(hour, '1:00:00.0')then TIMEDIFF(logout, login)
   when login >= hour and logout > ADDTIME(hour, '1:00:00.0') then TIMEDIFF(ADDTIME(hour, '1:00:00.0'), login)
   when login < hour and logout < ADDTIME(hour, '1:00:00.0') then TIMEDIFF(logout, hour)
   else '00:00:00.0'
end case
from hourlist join loginlogout
on (login >= hour and login < ADDTIME(hour,'1:00:00.0')) or (logout >= hour
and logout < ADDTIME(hour,ADDTIME(hour,'1:00:00.0'))
order by hour

很抱歉发布错误的帖子或其他任何我搞砸了,第一次发帖。提前谢谢。

---不知道我是否越来越近......但这是我根据每个人的反馈得到的。这仍然是错误的......

select hourlist.hour, employeelabor.empposid,
    case 
when employeelabor.clockin < hourlist.hour and employeelabor.clockout >= dateadd(HH,1,hourlist.hour) then '1:00:00.0'
when employeelabor.clockin >= hourlist.hour and employeelabor.clockout < dateadd(HH,1,hourlist.hour) then datediff(mi,employeelabor.clockout, employeelabor.clockin)
when employeelabor.clockin >= hourlist.hour and employeelabor.clockout > dateadd(HH,1,hourlist.hour) then datediff(mi,1,dateadd(mi,hourlist.hour,1))
when employeelabor.clockin < hourlist.hour and employeelabor.clockout < dateadd(HH,1,hourlist.hour) then datediff(mi, hourlist.hour, employeelabor.clockout)
    else '00:00:00.0'
end 
MinWorked
from hourlist
    JOIN dbo.employeelabor
        on (employeelabor.clockin >= hourlist.hour and employeelabor.clockin < dateadd(HH,1,hourlist.hour) 
        or (employeelabor.clockout >= hourlist.hour
        and employeelabor.clockout < dateadd(hh,hourlist.hour,dateadd(hh,hourlist.hour,1))
order by hourlist.Hour

2 个答案:

答案 0 :(得分:0)

对这些功能使用以下语法:

DATEADD(HH, 1, [hour])

HH是几个小时,您在[小时]列中向DateTime添加了1小时。

DATEDIFF(mi, [hour], [logout])

mi是几分钟。

CASE WHEN ... THEN ... ELSE ... END

这与mysql几乎相同。

答案 1 :(得分:0)

对于SQL Server(Transact-SQL),假设hourloginlogout是数据类型TIME ...

与MySQL ADDTIME(foo,'1:00:00')相当的粗略是

DATEADD(HOUR,1,foo)

SQL Server 2008或更高版本中与MySQL TIMEDIFF(bar,foo)的粗略等价物将是

DATEDIFF(SECOND,foo,bar)

此表达式将返回整数秒数(&#34;边界数&#34;交叉)。要将格式化为hh:mm:ss格式的字符串,您需要使用整数除法和模数函数。例如:

FLOOR(integer_seconds / 3600)        = whole hours
FLOOR((integer_seconds % 3600) / 60) = remainder whole minutes 
FLOOR(integer_seconds % 60)          = remainder whole seconds

要将分钟和秒格式化为两个字符,您可以将整数值强制转换为VARCHAR,前置一个&#39; 0&#39;字符,并取最右边的两个字符。

或者,要获取格式化的整数秒,您可以将值取为某个虚拟日期时间值(午夜),以获取datetime,然后CONVERT使用样式获取VARCHAR它可以为您提供所需的格式。 (您可能需要使用规范/固定格式样式(如20?)"yyyy-mm-dd hh:mm:ss",并使用字符串函数(SUBSTR或RIGHT)来删除&#34;日期部分。)