Sql server 在sql中查找两个时间之间的转换时间

Sql 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.

我有班长表,其中每台机器分配开始时间和结束时间,机器可以多次轮班。机器上有一些作业正在进行中

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.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)