我有问题使用sql,我无法理解。
我有一个包含2列(in_time,out_time)的主表(clockins)和以下记录。
2017-01-17 06:00:00.000 to 2017-01-17 07:00:00.000
2017-01-17 09:00:00.000 to 2017-01-17 11:00:00.000
2017-01-17 17:00:00.000 to 2017-01-17 20:00:00.000
然后我有第二个查找表(轮班),它也有2个日期时间列。 (shiftstart,shiftend)
2015-01-17 06:00:00.000 to 2015-01-17 16:00:00.000
2015-01-17 18:00:00.000 to 2015-01-17 23:00:00.000
我想要实现的目的是显示与我的主表(clockins)之间的总分差,其中in_time在第二个表中的日期之间。
我已尝试使用"在"之间进行子查询,但是shift表有超过1条记录我必须检查。我尝试的另一个解决方案是在轮班表上使用循环,然后只使用基于轮班表中每条记录的选择查询。这有效,但我可以看到这变得非常慢。
根据以上信息,应返回clockins表的第1行和第2行,结果为3小时= 180分钟,省略记录2017-01-17 17:00:00.000
我希望这是有道理的。
答案 0 :(得分:0)
您没有指定DBMS,但以下是标准SQL(假设out_time和in_time实际上是timestamp
列)。结果会产生interval
:
select c.out_time - c.in_time as duration
from clockins c
join shifts s on c.in_time between s.shiftstart and s.shiftend;
以上假设2017年是您样本数据中的拼写错误。如果你确实在时间戳上有不同的年份,并且只想要比较clockins的时间你需要做这样的事情(再次:这是标准的SQL)
select c.out_time - c.in_time as duration
from clockins c
join shifts s on cast(c.in_time as time) between cast(s.shiftstart as time) and cast(s.shiftend as time);
这将完全忽略时间戳的日期部分
SQLFiddle示例:http://sqlfiddle.com/#!15/75a47/1
答案 1 :(得分:0)
我认为您需要确定日期时间范围是否重叠。 如果两个表之间没有公共字段,请尝试:
select Sum(DATEDIFF(hh, a.in_time, a.out_time)) as hoursWorkedThisShift
from clockins a
WHERE a.in_time <= '2015-01-17 16:00:00.000' and a.out_time >= '2015-01-17 06:00:00.000'