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
MySQLADDTIME(foo,'1:00:00')
的大致等价物是
DATEADD(HOUR,1,foo)
在SQLServer2008或更高版本中,与MySQLTIMEDIFF(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