sql将月份布尔值字段保存为整数以进行按位操作

时间:2018-11-08 17:21:43

标签: sql-server binary bit-manipulation

可能是对此进行了过度思考。问题是我继承了一个数据库,该数据库的成员可以有两个(或多个)地址作为成员资格(例如季节性)记录的一部分(地址在单独的记录中),并且数据库操作取决于该成员当前位于的地址。

当前,每个月(一月,二月等)是一个位字段。因此,为了查询成员在本月(或月份的跨度)中的位置,您必须选择与当前月份(或期间的月份跨度)匹配的字段名称,这意味着您必须按变量字段名称进行查询...或浏览12个字段-笨拙。在我看来,它应该是通过按位异或运算(一个月被标记,一个查询期被查询)查询的整数字段,或者通过将字段值“添加”到一串转换为整数的位数中,然后使用按位比较。

第二种选择是可以的(不会更改表结构),但宁愿使用一个整数字段来表示12个月的二进制版本,然后使用它。

无论哪种情况,距离我做了很多按位工作都已经有很多年了,更不用说如何转换为二进制表示形式了。我希望某个地方已经有已发布的答案,但是找不到它。有什么建议么?谢谢!

1 个答案:

答案 0 :(得分:0)

由于您愿意使用整数字段,因此请在表中添加一列以保存月份数值。

alter table myTable
add column MonthNum int

alter table myTable
add constraint CK_Month_Range CHECK (MonthNum > 0 and MonthNum < 13)

在整数字段中存储月份数字的位表示没有任何好处,因为将占用相同的空间量(4个字节)。许多系统表都使用按位值,但是在这种情况下,我看不出它会如何改善。

为了检查它们是否在那里,我可能会做两件事之一。

  • bit值列用于IsCurrent
  • 使用行版本控制的形式,其中最后更新的日期时间将是当前记录

这是按位的检查类型,检查您的应用程序是否将参数作为整数发送

declare @table table (id int identity(1,1), jan bit, feb bit, mar bit, apr bit, may bit, jun bit, jul bit, aug bit, sep bit, oct bit, nov bit, [dec] bit)

insert into @table
values
(0,0,0,0,0,0,0,1,0,0,0,0), --aug
(0,0,1,0,0,0,0,0,0,0,0,0), --mar
(0,0,0,0,0,0,0,0,0,0,0,1), --dec
(1,0,0,0,0,0,0,0,0,0,0,0)   --jan


declare @month int = 3

select *, bitwise = concat(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,[dec])
from @table
where charindex('1',concat(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,[dec])) = @month

如果它们正在传递字符串,例如“ January”,那么您只需加入查找表即可。