Sql server 在sql中查找两个时间之间的转换时间
我有班长表,其中每台机器分配开始时间和结束时间,机器可以多次轮班。机器上有一些作业正在进行中 i、 换档操纵杆,例如asSql server 在sql中查找两个时间之间的转换时间,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有班长表,其中每台机器分配开始时间和结束时间,机器可以多次轮班。机器上有一些作业正在进行中 i、 换档操纵杆,例如as MachineID SHIFTID STIME ETIME A110T02 1 07:00:00.0000000 16:00:00.0000000 A110T02 2 14:00:00.0000000 23:00:00.0000000 A110T02 3 23:00:00.
MachineID SHIFTID STIME ETIME
A110T02 1 07:00:00.0000000 16:00:00.0000000
A110T02 2 14:00:00.0000000 23:00:00.0000000
A110T02 3 23:00:00.0000000 07:00:00.0000000
如果我传递了机器名、开始作业日期时间和结束作业时间,则应重新调整轮班开始时间和结束时间
我面临着第三班的问题,因为它涉及午夜时间,即两天
我希望你能提供这样的信息
@machineName = 'A110T02'
@startJobdatetime = '2015-12-01 23:02:00'
@EndJobdatetime = '2015-12-01 23:20:00'
结果应该返回
3 23:00:00.0000000 07:00:00.0000000
或
此链接中给出了正确的格式应该可以:
declare @machineName varchar(50) = 'A110T02'
declare @startJobdatetime datetime = '2015-12-01 23:02:00'
declare @EndJobdatetime datetime = '2015-12-01 23:20:00'
SELECT *
FROM @ShiftMaster
WHERE MachineID = @machineName
AND CAST(DATEADD(hour, -7, @startJobdatetime) as time) >= DATEADD(hour, -7, STIME)
AND CAST(DATEADD(hour, -7, @EndJobdatetime) as time) <= DATEADD(NANOSECOND, -100, DATEADD(hour, -7, ETIME))
数据:
MachineID SHIFTID STIME ETIME
A110T02 3 23:00:00.0000000 07:00:00.0000000
declare @ShiftMaster table(MachineID varchar(50), SHIFTID int , STIME time, ETIME time)
INSERT INTO @ShiftMaster(MachineID, SHIFTID, STIME, ETIME) values
('A110T02', 1, '07:00:00.0000000', '16:00:00.0000000')
, ('A110T02', 2, '14:00:00.0000000', '23:00:00.0000000')
, ('A110T02', 3, '23:00:00.0000000', '07:00:00.0000000')
试一试
DECLARE@Tmp表(MachineID VARCHAR(20)、SHIFTID INT、STIME VARCHAR(25)、ETIME VARCHAR(25))
插入@Tmp选择'A110T02',1,'07:00:00.0000000','16:00:00.0000000'
插入@Tmp选择'A110T02',2,'14:00:00.0000000','23:00:00.0000000'
插入@Tmp选择'A110T02',3,'23:00:00.0000000','07:00:00.0000000'
声明@machineName VARCHAR(20)='A110T02'
,@startJobdatetime VARCHAR(25)='2015-12-01 23:02:00'
,@EndJobdatetime VARCHAR(25)='2015-12-01 23:20:00'
,@ShiftId INT=3
;以t11为例
(选择MachineID、SHIFTID、,
将(左(@startJobdatetime,10)转换为datetime)+将(时间)转换为datetime转换为st,
cast(cast(左(@startJobdatetime,10)作为datetime)+cast(ETIME作为time)作为datetime)等
从@tmp where cast(按时间计算)>cast(按时间计算)
联合所有
选择MachineID、SHIFTID、,
转换(转换(左(@startJobdatetime,10)为日期时间)+转换(时间为时间)为日期时间,
转换(转换(左(@startJobdatetime,10)为日期时间)+转换('23:59:59.999'为时间)为日期时间)
从@Tmp where cast(etime as time)开始,如果我输入DECLARE@machineName VARCHAR(20)='A110T02',@startJobdatetime VARCHAR(25)='2015-12-01 00:06:00',@EndJobdatetime VARCHAR(25)='2015-12-01 06:33:00',则返回null。我已将其修改为包含您的查询,您的移位记录逻辑不清楚,谢谢
DECLARE @Tmp table (MachineID VARCHAR(20),SHIFTID INT,STIME VARCHAR(25),ETIME VARCHAR(25))
INSERT @Tmp SELECT 'A110T02',1,'07:00:00.0000000','16:00:00.0000000'
INSERT @Tmp SELECT 'A110T02',2,'14:00:00.0000000','23:00:00.0000000'
INSERT @Tmp SELECT 'A110T02',3,'23:00:00.0000000','07:00:00.0000000'
DECLARE @machineName VARCHAR(20) = 'A110T02'
,@startJobdatetime VARCHAR(25) = '2015-12-01 23:02:00'
,@EndJobdatetime VARCHAR(25) = '2015-12-01 23:20:00'
,@ShiftId INT = 3
;with t11 as
(select MachineID,SHIFTID,
cast(CAST(left(@startJobdatetime,10) AS datetime)+cast(stime as time) as datetime) as st,
cast(cast(left(@startJobdatetime,10) AS datetime)+cast(ETIME as time) as datetime) et
from @tmp where cast(etime as time)>cast(stime as time)
union all
select MachineID,SHIFTID,
cast(CAST(left(@startJobdatetime,10) AS datetime)+cast(stime as time) as datetime),
cast(CAST(left(@startJobdatetime,10) AS datetime)+cast('23:59:59.999' as time) as datetime)
from @Tmp where cast(etime as time)<cast(stime as time)
union all
select MachineID,SHIFTID,
CAST(left(@startJobdatetime,10) AS datetime),
cast(cast(left(@startJobdatetime,10) as datetime)+cast(ETIME as time) as datetime) from @Tmp
where cast(etime as time)<cast(stime as time)
)
select t.MachineID,t.SHIFTID,t.STIME,t.ETIME from t11 join @Tmp t on t.MachineID=t11.MachineID and t.SHIFTID=t11.SHIFTID
where t11.MachineID = @machineName and st<=cast(@startJobdatetime as datetime) and et>=cast(@EndJobdatetime as datetime)