sql - 从位掩码确定一周中的几天

标签 sql sql-server tsql datetime bitmask

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

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

2014-05-27 是一个Tuesday,该形态的开始位置是Tuesday。因此,我希望结果显示星期二星期三星期四星期五

2015-10-25 是一个星期日,该形态的起始位置是星期日。结果应为星期日星期一星期二星期五星期六

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

最佳答案

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

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

enter image description here

Execution Plan for Cross Apply Approach

enter image description here

关于sql - 从位掩码确定一周中的几天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864473/

相关文章:

sql - 从具有相同外键的所有其他记录都具有特定值的表中选择记录

php - 查询返回所需的行,直到添加 LIKE

c# - 在 C# 中打开/关闭 SqlConnection 的最佳方法是什么

mysql - 跟踪如何获取 BOM 及其子 BOM( Material list )的过程

sql-server - SQL Server 角色、架构、用户

sql-server - 如何在 SQL Server 中使用 LIKE 运算符找到 ' % '?

sql - 如何在 PostgreSQL 中格式化数字?

mysql - 在一行中显示 Mysql 中的上一个和下一个日期值

sql - 如何通过特定顺序检测值的变化

sql - 如何使用连接查询一列中有多个值的表