在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几)

原文: 在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。



整数解析星期几 


1 = 星期日 2 = 星期一 4 = 星期二 8 = 星期三 16 = 星期四 32 = 星期五 64 = 星期六,


化为二进制
0000001=星期日 
0000010=星期一 
0000100=星期二 
0001000=星期三 
0010000=星期四 
0100000=星期五 
1000000=星期六

以此类推,0111111就代表 了星期日~星期五

0111111化为十进制为63

那么这个63如何在sqlserver里面解析出代表了 星期日~星期五。


其实,这个数字代表星期几,如果在C语言中,就是一个枚举类型。

下面,是我的方法:


   
   
  1. declare @i int
  2. declare @v nvarchar( 100)
  3. set @i = 63 --你输入的数字
  4. set @v = ''
  5. SELECT @v = @v+ CASE WHEN @i & v1 <> 0 then ','+v2 else '' end
  6. FROM
  7. (
  8. SELECT 1 v1, '星期日' v2 union all
  9. SELECT 2, '星期一' union all
  10. SELECT 4, '星期二' union all
  11. SELECT 8, '星期三' union all
  12. SELECT 16, '星期四' union all
  13. SELECT 32, '星期五' union all
  14. SELECT 64, '星期六'
  15. )t
  16. select stuff(@v, 1, 1, '')
  17. /*
  18. 星期日,星期一,星期二,星期三,星期四,星期五
  19. */
  20. set @i= 3
  21. SELECT @v = @v+ CASE WHEN @i & v1 <> 0 then ','+v2 else '' end
  22. FROM
  23. (
  24. SELECT 1 v1, '星期日' v2 union all
  25. SELECT 2, '星期一' union all
  26. SELECT 4, '星期二' union all
  27. SELECT 8, '星期三' union all
  28. SELECT 16, '星期四' union all
  29. SELECT 32, '星期五' union all
  30. SELECT 64, '星期六'
  31. )t
  32. select stuff(@v, 1, 1, '')
  33. /*
  34. 星期日,星期一
  35. */

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/12020019.html
今日推荐