目前正在使用SQL Server,我有一个表,其中登记了从登记日期开始的计划更改(空是员工休假)
问题是,当我try 取消透视表并连接日历表时,如果有两次或更多更改,它会复制这些值,它会复制从更改日期开始的值.
这是我目前为止所做的
`IF OBJECT_ID('tempdb..#ScheduleChange') Is Not Null Drop Table #ScheduleChange
Create table #ScheduleChange(ChangeDate Date, EmployeeId NVARCHAR(50), Monday NVARCHAR(50), Tuesday NVARCHAR(50), Wednesday NVARCHAR(50), Thursday NVARCHAR(50), Friday NVARCHAR(50), Saturday NVARCHAR(50), Sunday NVARCHAR(50))
INSERT INTO #ScheduleChange VALUES
('2024-01-02','100', '11:00 a.m.-7:00 p.m.', '11:00 a.m.-7:00 p.m.','11:00 a.m.-7:00 p.m.','11:00 a.m.-7:00 p.m.','11:00 a.m.-7:00 p.m.',NULL,'10:00 a.m.-2:00 p.m.'),
('2024-01-14','100','9:00 a.m-5:00 p.m','9:00 a.m-5:00 p.m','9:00 a.m-5:00 p.m','9:00 a.m-5:00 p.m','9:00 a.m-5:00 p.m',NULL,'10:00 a.m.-2:00 p.m.'),
('2024-01-04', '200','9:00 a.m.-5:00 p.m.','9:00 a.m.-5:00 p.m.','9:00 a.m.-5:00 p.m.','9:00 a.m.-5:00 p.m.','9:00 a.m.-5:00 p.m.','9:00 a.m.-1:00 p.m.',NULL),
('2024-01-10','200','10:00 a.m.-6:00 p.m.','10:00 a.m.-6:00 p.m.','10:00 a.m.-6:00 p.m.','10:00 a.m.-6:00 p.m.','10:00 a.m.-6:00 p.m.','10:00 a.m.-2:00 p.m.',NULL)
IF OBJECT_ID('tempdb..#Calendar') Is Not Null Drop Table #Calendar
Create table #Calendar(Date Date, WeekDayName NVARCHAR(15))
Declare @Start Date
Set @Start = '20240101'
WHILE @Start <= Cast(Getdate()-1 As Date)
BEGIN
INSERT #Calendar
Select @Start,
DATENAME(DW,@Start)
Set @Start =Dateadd(day,1,@Start)
End
;WITH
schedules
AS
(
SELECT ChangeDate, EmployeeId, Schedule, WeekDayName
FROM #ScheduleChange
unpivot
(
Schedule
for WeekDayName in (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday)
) unpiv
)
SELECT schedules.*, #Calendar.Date
FROM schedules JOIN #Calendar ON #Calendar.date >= schedules.ChangeDate AND schedules.WeekDayName = #Calendar.WeekDayName
ORDER BY schedules.EmployeeId, schedules.ChangeDate`
结果给了我从那一天开始的复制品.
有没有办法覆盖时间表,一旦有一个变化,从该日期向前,而不是复制一切?