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

Sql 当开始和结束时间在不同的小时内时,确定按小时计算的工作分钟数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两张桌子: HourList-一天中的每一个小时都在一块地上:小时 LoginLogout-有员工,并且在登录和退出时 我正试图根据MySQL中的一个答案改编代码,但是有各种各样的问题,从CASE语句到timeadd到dateadd的转换。我真的相信这个MySQL代码正是我想要的,我只是没有能力自己将它转换成SQL。这是MySQL的代码。。。我的是一团糟,不值得张贴 select hour, userid, case when login < hour and logout &g

我有两张桌子:
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
选择小时、用户ID、,
案例
当登录=ADDTIME(hour,'1:00:00.0')时,则为'1:00:00.0'
当登录>=hour且注销=hour和logout>ADDTIME(hour,'1:00:00.0')时,然后是TIMEDIFF(ADDTIME(hour,'1:00:00.0'),login)
当登录=小时,登录=小时)
并注销
很抱歉,我第一次发帖时就把发帖协议弄糟了。提前谢谢

---我不知道我是否离得越来越近了…但这是我根据每个人的反馈得到的。它仍然在出错

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
选择hourlist.hour,employeelabor.empposid,
案例
当employeelabor.clockin=dateadd(HH,1,hourlist.hour)时,则为“1:00:00.0”
当employeelabor.clockin>=hourlist.hour和employeelabor.clockout=hourlist.hour和employeelabor.clockout>dateadd(HH,1,hourlist.hour)时,则为datediff(mi,1,dateadd(mi,hourlist.hour,1))
当employeelabor.clockin=hourlist.hour和employeelabor.clockin=hourlist.hour)
和employeelabor.clockout
对这些函数使用以下语法:

DATEADD(HH,1,[hour])

HH表示小时,您在[hour]列的DateTime中添加了1小时

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

mi持续几分钟

CASE WHEN…THEN…ELSE…END

这与mysql非常相似。

对于SQL Server(Transact-SQL),假设
hour
login
logout
是数据类型
TIME

MySQL
ADDTIME(foo,'1:00:00')
的大致等价物是

DATEADD(HOUR,1,foo)
在SQLServer2008或更高版本中,与MySQL
TIMEDIFF(bar,foo)
大致相当的是

DATEDIFF(SECOND,foo,bar)
此表达式将返回整数秒数(跨越的“边界”数)。要将其格式化为
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
,在“0”字符前加上前缀,并取最右边的两个字符


或者,要格式化整型秒数,您可以将该值转换为某个虚拟日期时间值(午夜),以获取
datetime
,然后
将该值转换为VARCHAR,使用一种可以获得所需格式的样式。(您可能需要使用规范/固定格式样式(如20?
“yyyy-mm-dd hh:mm:ss”
,并使用字符串函数(SUBSTR或RIGHT)来“删除”日期部分。)

列的数据类型是什么?您提到这是MySQL语法,但目标DBMS是什么?SQL Server、Oracle、Postgres、DB2、Teradata?目标数据库是SQLhour,登录、注销都是实时的(7)Sql,是的,但是谁的Sql。有大量的Sql实现,日期/时间类型和处理在不同的实现之间差异很大。您针对的是哪一个特定的数据库系统?在Sql中,案例要求您说出哪个列…而在MySQL中则没有。在MSSQL中会是什么样子?我不确定您所说的“案例要求”是什么意思请告诉我是哪一列。'SQL Server与MySQL的处理方式相同,下面是您案例的一部分,翻译为:
CASE当登录=DATEADD(HH,1,[hour]),然后60 end