首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个位值存储在单个表列中

将多个位值存储在单个表列中
EN

Stack Overflow用户
提问于 2012-03-10 02:41:54
回答 4查看 10K关注 0票数 3

我需要将一周一天的日程安排存储在数据库中,在数据库中,我可以安排一天或多天的记录(比如说,它代表一项任务)。我需要将它存储在一个列中,这样就可以方便地保存和检索。然后,每天我选择日程与当前一周的日期相匹配的记录,比如:给我所有的记录和第七周的日程匹配。

在我脑海中浮现的是一系列7位,每一位代表一周中的一天,其中0表示没有时间表,1表示预定。例如:"1111111“表示日常任务的情况,"1000000”表示仅在一周的第一天运行的任务。

为了清楚起见,记录可能会安排在任何时间组合中,我不知道,因此检索中唯一的输入将是平日搜索。

我有两个问题:

  1. 在Server 2008中存储这类数据的最佳方法是什么?
  2. 是上述方法的更好的替代方案。我需要高效且易于实现的解决方案。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-10 03:07:24

可以将其存储为位字段,然后使用布尔逻辑运算符检索值。

例如:

代码语言:javascript
复制
CREATE TABLE [dbo].[testBF](
    [field1] [varchar](max) NOT NULL,
    [field2] [varchar](max) NOT NULL,
    [bitfield] [int] NOT NULL CONSTRAINT [DF_testBF_bitfield]  DEFAULT ((0))
) ON [PRIMARY]

然后供选择:

代码语言:javascript
复制
SELECT field1, field2,
       CASE WHEN (bitfield & 1) = 1 THEN 'monday ' ELSE '' END + 
       CASE WHEN (bitfield & 2) = 2 THEN 'tuesday ' ELSE '' END +
       CASE WHEN (bitfield & 4) = 4 THEN 'wednesday ' ELSE '' END +
       CASE WHEN (bitfield & 8) = 8 THEN 'thursday ' ELSE '' END +
       CASE WHEN (bitfield & 16) = 16 THEN 'friday' ELSE '' END as [days of week]
FROM testBF

查找包含“星期二”标志的所有日子(星期二是第二位或2^1或2)

代码语言:javascript
复制
SELECT * 
FROM aTable
WHERE (bitfield & 2) = 2

代码语言:javascript
复制
SELECT * 
FROM aTable
WHERE (bitfield & 2) != 0

注意,第二种情况下的模板将适用于任何比特--即星期五(第5位或2^4或16位)。

代码语言:javascript
复制
SELECT * 
FROM aTable
WHERE (bitfield & 16) != 0

最后是一般情况..。输入一个数字(星期一为1)

代码语言:javascript
复制
SELECT * 
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0

对我来说,这似乎是一项很大的工作,当您只需将其保存为5位字段(或7位字段)时,您就可以这样做。

关于更多的例子,请看我为另一个问题写的要点:

https://gist.github.com/1846338

答案是:

https://stackoverflow.com/a/9302106/215752

票数 9
EN

Stack Overflow用户

发布于 2012-03-10 03:17:44

你说的是“比特面具”。这些都是方便的设备,因为您可以在它们上应用二进制数学来轻松地检查值,但是它们确实需要一些设置。如果再扩展一点,就会出现这样的情况。

代码语言:javascript
复制
-- You will want to work with constants
DECLARE @Mon INT, @Tue INT, @Wed INT, @Thu INT, @Fri INT, @Sat INT, @Sun INT

SET @Mon = POWER(2,0) -- 1
SET @Tue = POWER(2,1) -- 2
SET @Wed = POWER(2,2) -- 4
SET @Thu = POWER(2,3) -- 8
SET @Fri = POWER(2,4) -- 16
SET @Sat = POWER(2,5) -- 32
SET @Sun = POWER(2,6) -- 64

-- Set Monday and Wednesday
UPDATE T SET Schedule = @Mon | @Wed

-- Find all tasks scheduled on Tuesday
SELECT * FROM T WHERE Schedule & @Tue = @Tue

-- Find all tasks scheduled on Tuesday and Saturday
SELECT * FROM T WHERE Schedule & @Tue | @Sat = @Tue | @Sat
票数 1
EN

Stack Overflow用户

发布于 2012-03-10 03:53:06

我不知道你所说的容易查询是什么意思。一旦你把它包装成一个函数,那就很容易了。简单的即席查询的一种选择可能是具有易于阅读的字符串字段,并使用一些字符串操作过程来解决它。示例:

代码语言:javascript
复制
UPDATE T SET Schedule = 'M|W|H'

SELECT * FROM T WHERE CHARINDEX(Schedule, 'M') > -1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9643491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档