从位掩码确定星期几
Determine days of week from bit mask
我正在使用第三方应用程序并尝试根据数据提取有关班次信息的有意义的信息。
shift_pattern_start_dt pattern
2014-05-27 1111000
2015-10-25 1110011
2014-05-27
是一个Tuesday
模式的起始位置是Tuesday
。所以我希望结果显示 Tuesday
、Wednesday
、Thursday
和 Friday
.
2015-10-25
是一个Sunday
这个模式的起始位置是Sunday
。结果应为 Sunday
、Monday
、Tuesday
、Friday
和 Saturday
。
对于确定正确的工作日有什么想法或建议吗?
Declare @YourTable table (shift_pattern_start_dt date, pattern varchar(25))
Insert Into @YourTable values
('2014-05-27','1111000'),
('2015-10-25','1110011')
Select *
,NewCol = concat(
IIF(substring(pattern,1,1)='1', +DateName(WEEKDAY,shift_pattern_start_dt),'')
,IIF(substring(pattern,2,1)='1',','+DateName(WEEKDAY,dateadd(DAY,1,shift_pattern_start_dt)),null)
,IIF(substring(pattern,3,1)='1',','+DateName(WEEKDAY,dateadd(DAY,2,shift_pattern_start_dt)),null)
,IIF(substring(pattern,4,1)='1',','+DateName(WEEKDAY,dateadd(DAY,3,shift_pattern_start_dt)),null)
,IIF(substring(pattern,5,1)='1',','+DateName(WEEKDAY,dateadd(DAY,4,shift_pattern_start_dt)),null)
,IIF(substring(pattern,6,1)='1',','+DateName(WEEKDAY,dateadd(DAY,5,shift_pattern_start_dt)),null)
,IIF(substring(pattern,7,1)='1',','+DateName(WEEKDAY,dateadd(DAY,6,shift_pattern_start_dt)),null)
)
From @YourTable
Returns
shift_pattern_start_dt pattern NewCol
2014-05-27 1111000 Tuesday,Wednesday,Thursday,Friday
2015-10-25 1110011 Sunday,Monday,Tuesday,Friday,Saturday
EDIT - Cross Apply Version
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select NewCol =Stuff((Select ',' +D
From (
Select N,D = IIF(substring(A.pattern,N,1)='0',null,DateName(WEEKDAY,DateAdd(DAY,N-1,A.shift_pattern_start_dt)))
From (Values (1),(2),(3),(4),(5),(6),(7)) N(N)
) B1
For XML Path ('')),1,1,'')
) B
Execution Plan for Concat() Approach
Execution Plan for Cross Apply Approach
我正在使用第三方应用程序并尝试根据数据提取有关班次信息的有意义的信息。
shift_pattern_start_dt pattern
2014-05-27 1111000
2015-10-25 1110011
2014-05-27
是一个Tuesday
模式的起始位置是Tuesday
。所以我希望结果显示 Tuesday
、Wednesday
、Thursday
和 Friday
.
2015-10-25
是一个Sunday
这个模式的起始位置是Sunday
。结果应为 Sunday
、Monday
、Tuesday
、Friday
和 Saturday
。
对于确定正确的工作日有什么想法或建议吗?
Declare @YourTable table (shift_pattern_start_dt date, pattern varchar(25))
Insert Into @YourTable values
('2014-05-27','1111000'),
('2015-10-25','1110011')
Select *
,NewCol = concat(
IIF(substring(pattern,1,1)='1', +DateName(WEEKDAY,shift_pattern_start_dt),'')
,IIF(substring(pattern,2,1)='1',','+DateName(WEEKDAY,dateadd(DAY,1,shift_pattern_start_dt)),null)
,IIF(substring(pattern,3,1)='1',','+DateName(WEEKDAY,dateadd(DAY,2,shift_pattern_start_dt)),null)
,IIF(substring(pattern,4,1)='1',','+DateName(WEEKDAY,dateadd(DAY,3,shift_pattern_start_dt)),null)
,IIF(substring(pattern,5,1)='1',','+DateName(WEEKDAY,dateadd(DAY,4,shift_pattern_start_dt)),null)
,IIF(substring(pattern,6,1)='1',','+DateName(WEEKDAY,dateadd(DAY,5,shift_pattern_start_dt)),null)
,IIF(substring(pattern,7,1)='1',','+DateName(WEEKDAY,dateadd(DAY,6,shift_pattern_start_dt)),null)
)
From @YourTable
Returns
shift_pattern_start_dt pattern NewCol
2014-05-27 1111000 Tuesday,Wednesday,Thursday,Friday
2015-10-25 1110011 Sunday,Monday,Tuesday,Friday,Saturday
EDIT - Cross Apply Version
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select NewCol =Stuff((Select ',' +D
From (
Select N,D = IIF(substring(A.pattern,N,1)='0',null,DateName(WEEKDAY,DateAdd(DAY,N-1,A.shift_pattern_start_dt)))
From (Values (1),(2),(3),(4),(5),(6),(7)) N(N)
) B1
For XML Path ('')),1,1,'')
) B
Execution Plan for Concat() Approach
Execution Plan for Cross Apply Approach