首页 > 解决方案 > 如何创建特定的 SQL Server 存储过程?

问题描述

我有一张CONTRACTOR_SCHEDULER桌子。“时间表”栏中的字母表示工作时间(m - 8:00-20:00,n - 20:00-8:00(第二天),d - 8:00-8:00(第二天),h-休假)。( Name, Begin_date) 是唯一的。

姓名 日程 开始日期 结束日期
约翰 心电图 2019-01-01 2019-01-08
约翰 nh 2019-01-09 2019-01-25
凯特 dh 2019-01-01 2019-01-07
凯特 关注 2019-01-08 2019-01-14
麦克风 NH 2019-01-01 2019-02-01
麦克风 小时 2019-02-02 2019-12-31

我需要一个 SQL Server 存储过程,它使用行创建新CONTRACTOR_WORK_DAY的工作日表CONTRACTOR_SCHEDULER(表中不显示休息日)。

例子:

第一行 - 约翰有时间表 nhm。第一个字母是 n 所以 begin_date - 2019-01-01 20:00,End_date - 2019-01-02 08:00。下一个字母是 h,请跳过它作为休息日。最后一个字母是 m 所以 begin_date - 2019-01-03 08:00,End_date - 2019-01-03 20:00。重复计划直到 2019-01-08 - 第一个表中的 end_date。

第一行的表CONTRACTOR_SCHEDULER将是:

姓名 开始日期 结束日期
约翰 2019-01-01 20:00 2019-01-02 08:00
约翰 2019-01-03 08:00 2019-01-03 20:00
约翰 2019-01-05 20:00 2019-01-06 08:00
约翰 2019-01-08 08:00 2019-01-08 20:00

我在 python 中使用了一些循环调度字符串等,但无法弄清楚如何在 SQL Server 的 T-SQL 中执行此操作。

标签: sqlsql-servertsql

解决方案


又一个选择。

不确定我是否同意所需结果的最后记录。我有2019-01-07你有2019-01-08

示例或dbFiddle

Select A.[Name]
      ,[Begin_Date] = convert(datetime,left(dateadd(DAY,N       ,[Begin_date]),10)+' '+BegTime)
      ,[End_Date]   = convert(datetime,left(dateadd(DAY,N+NxtDay,[Begin_date]),10)+' '+EndTime)
 From  YourTable A
 Cross Apply ( values ( left(replicate(Schedule,10),datediff(DAY,Begin_Date,End_Date)) ) )B(S)
 Cross Apply ( 
               Select N=N-1
                     ,Subs=substring(B.S,N,1)
                 From (  Select Top (len(S)+1) N=Row_Number() Over (Order By (Select Null)) From  master..spt_values n1 ) B1
             ) C
 Join ( values ('m','08:00','20:00',0)
              ,('n','20:00','08:00',1)
              ,('d','08:00','08:00',1)
      ) D(SchdCd,BegTime,EndTime,NxtDay) on Subs=SchdCd
 Order By [Begin_Date]

结果

Name    Begin_Date                  End_Date
John    2019-01-01 20:00:00.000     2019-01-02 08:00:00.000
John    2019-01-03 08:00:00.000     2019-01-03 20:00:00.000
John    2019-01-05 20:00:00.000     2019-01-06 08:00:00.000
John    2019-01-07 08:00:00.000     2019-01-07 20:00:00.000

推荐阅读