sql - 如何创建特定的 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 中执行此操作。
解决方案
又一个选择。
不确定我是否同意所需结果的最后记录。我有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
推荐阅读
- javascript - 移动导航没有响应
- javascript - 正则表达式从 HTML 代码的开头获取文本
- cron - 在覆盆子 crontab 上运行 cronitor
- python - Python - 如何使用 xlwt 根据在不同电子表格中使用 xlrd 找到的结果写入新的电子表格行?
- c# - 如何控制组合框结果在 switch-case 中何时为空
- r - 如何使用 ggplot2 在 Y 轴上添加美分和美元符号 ($) 的尾随零?
- kubernetes - 尝试在 Kubernetes 集群中使用 iSCSI 卷,但得到“错误的 fs 类型、错误的选项、/dev/sdb 上的错误超级块、缺少代码页或帮助程序”
- flutter - 如何在颤动中重塑多边形
- python - 使用 Python 和 Keras 库创建 LSTM 结构
- javascript - 我的 compile.js 文件中有一个关于 Solidity 项目的问题