【发布时间】:2019-09-10 08:30:10
【问题描述】:
我有以下表格 trnevents 用于日志打孔:
emp_reader_id DT
1066 2019-08-10 19:02:41.000
1066 2019-08-10 07:10:41.000
1066 2019-08-10 07:02:41.000
1066 2019-08-09 18:59:02.000
1066 2019-08-09 07:00:12.000
1066 2019-08-08 18:57:49.000
1066 2019-08-08 07:02:14.000
1066 2019-08-07 18:55:37.000
1066 2019-08-07 07:01:27.000
1066 2019-08-06 18:57:29.000
1066 2019-08-06 07:01:10.000
以下是按日期分配给员工的轮班时间表:
emp_reader_id 5 6 7 8 9 10 11
1066 14 14 14 14 14 13 13
Shift_days:
shift_id day_start_time night_shift day_end_time
13 7.00 0 19.00
14 19.00 1 7.00
我的查询:
update A set Belongs_to=CONVERT(VARCHAR(10),DATEADD(d, -1, A.DT) , 23),EventCatId=1
from dbo.trnevents A
LEFT JOIN dbo.shift_schedule SS ON A.emp_reader_id = SS.emp_reader_id
AND YEAR(DATEADD(d, 0, A.DT))=SS.year_no AND MONTH(DATEADD(d, 0, A.DT))=SS.month_no
LEFT JOIN dbo.shift ON dbo.shift.shift_id = CASE WHEN DAY(DATEADD(d, 0, A.DT))=1 THEN SS.[1]
WHEN DAY(DATEADD(d, 0, A.DT))=2 THEN SS.[2]
WHEN DAY(DATEADD(d, 0, A.DT))=3 THEN SS.[3]
WHEN DAY(DATEADD(d, 0, A.DT))=4 THEN SS.[4]
WHEN DAY(DATEADD(d, 0, A.DT))=5 THEN SS.[5]
WHEN DAY(DATEADD(d, 0, A.DT))=6 THEN SS.[6]
WHEN DAY(DATEADD(d, 0, A.DT))=7 THEN SS.[7]
WHEN DAY(DATEADD(d, 0, A.DT))=8 THEN SS.[8]
WHEN DAY(DATEADD(d, 0, A.DT))=9 THEN SS.[9]
WHEN DAY(DATEADD(d, 0, A.DT))=10 THEN SS.[10]
WHEN DAY(DATEADD(d, 0, A.DT))=11 THEN SS.[11]
WHEN DAY(DATEADD(d, 0, A.DT))=12 THEN SS.[12]
WHEN DAY(DATEADD(d, 0, A.DT))=13 THEN SS.[13]
WHEN DAY(DATEADD(d, 0, A.DT))=14 THEN SS.[14]
WHEN DAY(DATEADD(d, 0, A.DT))=15 THEN SS.[15]
WHEN DAY(DATEADD(d, 0, A.DT))=16 THEN SS.[16]
WHEN DAY(DATEADD(d, 0, A.DT))=17 THEN SS.[17]
WHEN DAY(DATEADD(d, 0, A.DT))=18 THEN SS.[18]
WHEN DAY(DATEADD(d, 0, A.DT))=19 THEN SS.[19]
WHEN DAY(DATEADD(d, 0, A.DT))=20 THEN SS.[20]
WHEN DAY(DATEADD(d, 0, A.DT))=21 THEN SS.[21]
WHEN DAY(DATEADD(d, 0, A.DT))=22 THEN SS.[22]
WHEN DAY(DATEADD(d, 0, A.DT))=23 THEN SS.[23]
WHEN DAY(DATEADD(d, 0, A.DT))=24 THEN SS.[24]
WHEN DAY(DATEADD(d, 0, A.DT))=25 THEN SS.[25]
WHEN DAY(DATEADD(d, 0, A.DT))=26 THEN SS.[26]
WHEN DAY(DATEADD(d, 0, A.DT))=27 THEN SS.[27]
WHEN DAY(DATEADD(d, 0, A.DT))=28 THEN SS.[28]
WHEN DAY(DATEADD(d, 0, A.DT))=29 THEN SS.[29]
WHEN DAY(DATEADD(d, 0, A.DT))=30 THEN SS.[30]
WHEN DAY(DATEADD(d, 0, A.DT))=31 THEN SS.[31] END
LEFT JOIN dbo.shift_days ON dbo.shift.shift_id = dbo.shift_days.shift_id
and day_id = datepart(dw,CONVERT(VARCHAR(10), DATEADD(d, 0, A.DT), 23))
where CONVERT(VARCHAR(10), A.DT, 23) between CONVERT(VARCHAR(10), DATEADD(d, 1, @start_date), 23) and CONVERT(VARCHAR(10), DATEADD(d, 1, @end_date), 23)
and A.DT < isnull(DATEADD(D, 0, DATEDIFF(D, 0, DATEADD(d, 0, CONVERT(VARCHAR(10), A.DT, 23))))+
CONVERT(CHAR(8), DATEADD(SECOND,
DATEDIFF(SECOND, '02:00:00.0000000',cast(replace(cast(dbo.shift_days.day_start_time as varchar(7)),'.',':') as time)),
'00:00:00'), 8),(DATEADD(d, 0, CONVERT(VARCHAR(10), A.DT, 23)) + '10:00:00'))
and A.emp_reader_id in (select distinct emp_reader_id from daily_attendance_data
where CONVERT(VARCHAR(10),att_date, 23) = CONVERT(VARCHAR(10), DATEADD(d, -1, A.DT), 23) and night_shift=1)
我的输出:
emp_reader_id DT Belongs_to
1066 2019-08-10 07:02:41 2019-08-10
1066 2019-08-09 18:59:02 2019-08-09
1066 2019-08-09 07:00:12 2019-08-08
1066 2019-08-08 18:57:49 2019-08-08
1066 2019-08-08 07:02:14 2019-08-07
1066 2019-08-07 18:55:37 2019-08-07
第九天夜班-[18:59]-[7:02] 第10天轮班。 [7:00]-[19:00] 但属于日期未更新到 9th ,它分配到 10th。
2019-08-09 18:59:02.000 到 2019-08-10 07:02:41.000
我的预期输出:
emp_reader_id DT Belongs_to
1066 2019-08-10 19:02:41 2019-08-10
1066 2019-08-10 07:05:41 2019-08-10
1066 2019-08-10 07:02:41 2019-08-09
1066 2019-08-09 18:59:02 2019-08-09
1066 2019-08-09 07:00:12 2019-08-08
1066 2019-08-08 18:57:49 2019-08-08
1066 2019-08-08 07:02:14 2019-08-07
1066 2019-08-07 18:55:37 2019-08-07
请帮我解决这个问题。
【问题讨论】:
-
为什么
Shift Schedule中的行是重复的? -
预期输出的第 2 行和第 3 行。两者都有相同的
DT和2019-08-10 07:xx为什么一个属于2019-08-10而另一个属于2019-08-09 -
@Squirrel 2019-08-09 18:59:02 夜班在 mrng 07:02:41 结束,他又开始了他的下一个职责 07:05:41 - 19:02:41 全天转变
-
你怎么知道
07:02:41正在结束而不是开始?你的班次不是随着时间的推移是07:00吗?那么它不应该是转变的开始吗? -
表的关系是什么,什么是班次表,与其他表有什么关系,目前还不是很清楚。您显示输出,但您的主要查询是更新,它应该是 SELECT 吗?请发布表结构,甚至可以创建一个 SQLFIDDLE 示例。
标签: sql sql-server