gpt4 book ai didi

sql - 在单个表列中存储多个位值

转载 作者:行者123 更新时间:2023-12-01 09:04:51 24 4
gpt4 key购买 nike

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

我想到的是一系列 7 位,每个位代表一周中的一天,其中 0 表示未安排,1 表示已安排。例如:“1111111”表示日常任务,“1000000”表示仅在一周的第一天运行的任务。

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

我有两个问题:

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

  2. 上述方法有哪些更好的替代方案。我需要高效且易于实现的解决方案。

最佳答案

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

例如:

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]

然后为选择:

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 位或 2^1 或 2)

SELECT * 
FROM aTable
WHERE (bitfield & 2) = 2

SELECT * 
FROM aTable
WHERE (bitfield & 2) != 0

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

SELECT * 
FROM aTable
WHERE (bitfield & 16) != 0

最后是一般情况...传入一个数字(1 代表星期一)

SELECT * 
FROM aTable
WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0

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

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

https://gist.github.com/1846338

以及答案:

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

关于sql - 在单个表列中存储多个位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com