SQL Server在日期变化时跟踪计划的班次

SQL Server在日期变化时跟踪计划的班次,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我甚至不知道从哪里开始解决这个问题,我需要从我们的MS SQL 2012数据库中查询生产数据,该数据库有一个基于记录的班次的日期时间戳,棘手的是,我们以2开、2关、3开、2关的模式运行4个12小时的班次,即2013年1月的前3周: S M T W T F S 1 2 3 4 5 C/D A/B A/B C/D C/D 6 7 8 9 10 11 12 C/D A/B A/B C/D C/D A/B A/

我甚至不知道从哪里开始解决这个问题,我需要从我们的MS SQL 2012数据库中查询生产数据,该数据库有一个基于记录的班次的日期时间戳,棘手的是,我们以2开、2关、3开、2关的模式运行4个12小时的班次,即2013年1月的前3周:

S   M   T   W   T   F   S
        1   2   3   4   5
        C/D A/B A/B C/D C/D

6   7   8   9   10  11  12
C/D A/B A/B C/D C/D A/B A/B

13  14  15  16  17  18  19
A/B C/D C/D A/B A/B C/D C/D
A&C是早上7:00-19:00的班次,B&D是晚上19:00-7:00的班次我对SQL相当陌生,还没有做过类似的事情,我知道我可以通过以下方式轻松确定2013年1月1日上午班次的数据:

select *
from Line05
where L05Time BETWEEN '01/01/2013 07:00' AND '01/01/2013 19:00'

例如,但我不确定如何将其与C班次联系起来。

我确信,当假期或停工发生时,它会变得更加棘手。你像程序员一样思考,你认为有一种算法可以决定你的答案。相反,if会建议你像数据员一样思考。在某个地方应该有一个信息来源,可以找到你想要的答案。询问制定时间表的人是否知道。应该有一个表,告诉你什么班次分配给什么时段。使用它包含的数据来获得答案。

下面列出了一个轮班表。现在还不清楚您想要做什么,但是您应该能够使用此处显示的一些计算,通过逆向工程确定从事件日期/时间开始的偏移

编辑:已更正大小写以处理2/2/3/2模式

; with Samples as (
  -- Start at the beginning of 2013.
  select Cast( '01-01-2013 00:00' as DateTime ) as Sample
  union all
  -- Add hours up to the desired end date.
  select DateAdd( hour, 1, Sample )
    from Samples
    where Sample <= '2013-01-30'
  ),
  ExtendedSamples as (
  -- Calculate the number of days since the beginning of the first shift on 1/1/2013.
  select Sample, DateDiff( hour, '01-01-2013 07:00', Sample ) / 24 as Days
    from Samples ),
  Shifts as (
  -- Calculate the shifts for each day.
  select *,
    case when ( Days + 1 ) % 9 in ( 0, 1, 4, 5 ) then 'C/D' else 'A/B' end as Shifts
    from ExtendedSamples )
  select *,
    case when DatePart( hour, Sample ) between 7 and 18 then Substring( Shifts, 1, 1 ) else Substring( Shifts, 3, 1 ) end as Shift
    from Shifts
    option ( maxrecursion 0 )

能否说明前3周的数据是如何存储在数据库表中的?对于这个问题来说,有日历是很好的,但是如果没有更好地了解表的外观,我们就帮不了什么忙了。我要查询的表只包含我们的生产线dataWorkOrder、speed、good count、bad count、Quality%等以及数据写入的datetime列,在这种情况下,Db中的任何地方都没有任何员工或其他有用的东西,我将遵循@jerrylagrou的建议,查看我们的考勤软件数据库,看看是否有任何东西可以在那里使用。如果您仍然想要一些带有一个示例行的示例dataSQL Fiddletable模式,我还将尝试在稍后发布一个表的SQLFiddlewith:有完整源代码的最终解决方案吗?看来我们使用的考勤跟踪软件会自动生成时间表,它由我现在正在挖掘的SQL 2005 Db支持。谢谢!看起来,在进一步检查后,这实际上就可以了。这并不能解释每两周的“3开”日,即1/4/13、1/5/13、1/6/13都应该是轮班C/D,而这只是继续2开2关。@motoxrdr21-抱歉,我在你的问题中遗漏了这一点。查询已更新以处理2/2/3/2模式。谢谢,这似乎仍然将三人组放在错误的日期上,尽管上面的1/4、1/5和1/6应该是C/D,而第5和第6个是C/D,第6个是C/D,第七和第八是A/B我尝试调整案例,但似乎在一到两周内都无法获得准确的结果,我正在尝试根据周日的情况来制定一些新的方案,我们的自动调度程序使用的模式是轮班制,每周工作日、周三和周四,然后是下一周的周一、周二、周五,&Sat.@motoxrdr21-好吧,现在我有点困惑了。如果模式为每周期开2天、关2天、开3天、关2天、开9天,那么同一对班次总是会多出一天。你是说模式是每个周期开2天,关2天,开3天,开7天?一周的周期更有意义。如果是这样,只需将情况更改为0、1、4、5、6、9、10天+1%14,然后“C/D”或“A/B”作为班次结束。这个周期实际上是两周,有一点交替的步履蹒跚。