Sql INT转换为二进制,然后读取位
我的数据库中有一个INT值,它实际上存储了一周中选定的几天 例如,Sql INT转换为二进制,然后读取位,sql,sql-server,Sql,Sql Server,我的数据库中有一个INT值,它实际上存储了一周中选定的几天 例如,65=1000001 这意味着: 1:Sun 0:Mon 0:Tue 0:Wed 0:Thu 0:Fri 1:Sat 因此,我需要一个小临时工作台,上面有: DayOfWeek: Sunday Saturday 因此,读取INT,并输出一个天数表 这可以在SQL Server中完成吗?不要在SQL中解码,使用它们后会很痛苦。 如果存储了号码,则只需使用如下表进行连接: Code Pattern 64 Sun
65=1000001
这意味着:
1:Sun
0:Mon
0:Tue
0:Wed
0:Thu
0:Fri
1:Sat
因此,我需要一个小临时工作台,上面有:
DayOfWeek:
Sunday
Saturday
因此,读取INT,并输出一个天数表
这可以在SQL Server中完成吗?不要在SQL中解码,使用它们后会很痛苦。 如果存储了号码,则只需使用如下表进行连接:
Code Pattern
64 Sun
96 Sun-Mon
或者你可以这样做,如果你想每行
Code Pattern
64 Sun
96 Sun
96 Mon
甚至更好
否则会出现性能问题。在DB和SQL中,如果需要,加入总是比解码好
; with tbl as
(
select col = 65 union all
select col = 3
)
select *
from tbl t
cross apply
(
select DayOfWeek = 'Sun' where col & 64 = 64 union all
select DayOfWeek = 'Mon' where col & 32 = 32 union all
select DayOfWeek = 'Tue' where col & 16 = 16 union all
select DayOfWeek = 'Wed' where col & 8 = 8 union all
select DayOfWeek = 'Thu' where col & 4 = 4 union all
select DayOfWeek = 'Fri' where col & 2 = 2 union all
select DayOfWeek = 'Sat' where col & 1 = 1
) d
创建一个类似
colname值
太阳1号
周一| 2
周四星期二
星期三| 8
周四| 16
星期五| 32
周六| 64
将数据与表连接起来,并将值相加…在DB和SQL中,连接总是比解码好。你们只有128个组合,若我是你们,我宁愿使用一个参考表。意思是在输出中,你们只想要有1个值的一天,对吗?也解释一下65=1000001,这个组合是如何工作的?我写的答案基本上是这个,所以改为+1。
union
中的all
是不需要的:-)@Jcl,它实际上是需要的,因为它消除了检查重复项的需要。union all
不检查重复项(union
有)。。。事实上,我现在想到的union all
应该会更快it@Jcl,这就是我一直在说的。“联合体中的所有”消除了检查重复项的需要。哇。。。tat的神奇的“松鼠”——看起来很完美。