我需要将一周一天的日程安排存储在数据库中,在数据库中,我可以安排一天或多天的记录(比如说,它代表一项任务)。我需要将它存储在一个列中,这样就可以方便地保存和检索。然后,每天我选择日程与当前一周的日期相匹配的记录,比如:给我所有的记录和第七周的日程匹配。
在我脑海中浮现的是一系列7位,每一位代表一周中的一天,其中0表示没有时间表,1表示预定。例如:"1111111“表示日常任务的情况,"1000000”表示仅在一周的第一天运行的任务。
为了清楚起见,记录可能会安排在任何时间组合中,我不知道,因此检索中唯一的输入将是平日搜索。
我有两个问题:
发布于 2012-03-10 03:07:24
可以将其存储为位字段,然后使用布尔逻辑运算符检索值。
例如:
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^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
答案是:
发布于 2012-03-10 03:17:44
你说的是“比特面具”。这些都是方便的设备,因为您可以在它们上应用二进制数学来轻松地检查值,但是它们确实需要一些设置。如果再扩展一点,就会出现这样的情况。
-- 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发布于 2012-03-10 03:53:06
我不知道你所说的容易查询是什么意思。一旦你把它包装成一个函数,那就很容易了。简单的即席查询的一种选择可能是具有易于阅读的字符串字段,并使用一些字符串操作过程来解决它。示例:
UPDATE T SET Schedule = 'M|W|H'
SELECT * FROM T WHERE CHARINDEX(Schedule, 'M') > -1https://stackoverflow.com/questions/9643491
复制相似问题