【问题标题】:Determine days of week from bit mask从位掩码确定星期几
【发布时间】:2017-03-17 18:11:00
【问题描述】:

我正在使用第三方应用程序,并试图根据数据提取有关班次信息的有意义的信息。

shift_pattern_start_dt     pattern
2014-05-27                 1111000
2015-10-25                 1110011

2014-05-27Tuesday 模式的起始位置是Tuesday。所以我希望结果显示TuesdayWednesdayThursdayFriday

2015-10-25 是一个Sunday,这个模式的起始位置是Sunday。结果应该是SundayMondayTuesdayFridaySaturday

对于确定正确工作日有什么想法或建议?

【问题讨论】:

  • 你只需要爱上“创意”程序员......
  • @Igor:我爱他们,眼睛里有一根锋利的棍子。

标签: sql sql-server tsql datetime bitmask


【解决方案1】:
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

返回

shift_pattern_start_dt  pattern   NewCol
2014-05-27              1111000   Tuesday,Wednesday,Thursday,Friday
2015-10-25              1110011   Sunday,Monday,Tuesday,Friday,Saturday

编辑 - 交叉应用版本

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

Concat() 方法的执行计划

交叉应用方法的执行计划

【讨论】:

  • 这是一个很好的解决方案,但可以改进 - 考虑交叉应用以减少代码重复。
  • @ZoharPeled 其实这是我的第一个想法,本来打算发布“选项 A 和 B”,但决定玩得简单:)
  • @ZoharPeled DRY?不熟悉那个
  • DRY = D不要R重复Y我们自己。简而言之,如果您发现(很多)重复,则需要重构模块/方法(任何合适的)并调用抽象/重构代码(基本上尝试重用而不是重复)。此外,这是一个很好的答案(我是第一个支持者:)
  • 我也希望看到 Cross Apply 解决方案!!
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 2017-11-07
  • 2013-02-14
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多