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

Lam*_*mar 3 sql t-sql sql-server sql-server-2008

我需要在数据库中存储某种类型的星期调度,在那里我可以为一天或一周中的多天安排记录(比如它代表一项任务).我需要将它存储在一列中,以便于保存和检索.然后我每天选择日程安排与当前星期几匹配的记录,例如:给我所有记录与日程安排匹配第7周的日期.

我想到的是一系列7位,每一位代表星期几,其中0表示不计划,1表示计划.例如:"1111111"表示日常任务的情况,"1000000"表示仅在一周的第一天运行的任务.

为了清楚起见,记录可以安排在任何天的组合中,我不知道,因此检索中的唯一输入是搜索的工作日.

我这里有两个问题:

  1. 在SQL Server 2008中存储此类数据的最佳方法是什么?以某种方式允许根据当周的当前日期轻松查询.

  2. 什么是上述方法的更好的替代方案.请我需要高效且易于实施的解决方案.

Hog*_*gan 8

您可以将其存储为位域,然后使用布尔逻辑运算符来检索值

例如:

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]
Run Code Online (Sandbox Code Playgroud)

然后选择:

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
Run Code Online (Sandbox Code Playgroud)

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

SELECT * 
FROM aTable
WHERE (bitfield & 2) = 2
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * 
FROM aTable
WHERE (bitfield & 2) != 0
Run Code Online (Sandbox Code Playgroud)

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

SELECT * 
FROM aTable
WHERE (bitfield & 16) != 0
Run Code Online (Sandbox Code Playgroud)

最后一般情况......传递一个数字(星期一为1)

SELECT * 
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很多工作,当你可以将它保存为5(或7位字段)时,这就是你可以做到的.

有关更多示例,请查看我为另一个问题撰写的要点:

https://gist.github.com/1846338

和答案:

/sf/answers/651147451/