Yet another option.
Not sure if I agree with the last record of the desired results. I have 2019-01-07
while you have 2019-01-08
Example or 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]
Results
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