Sql 一周中的多天存储在一个字段中

Sql 一周中的多天存储在一个字段中,sql,sql-server-2008,date,Sql,Sql Server 2008,Date,关于特定整数字段存储数据的方式,我遇到了一些心理障碍 具体来说,有一列的整数范围为1-127;每个整数表示一周中不同天数的组合。例如:星期一=2^0或1,星期二=2^2或2,星期三=2^3或8;使用加法选项,星期一+星期二=3 我已经能够使用找到的示例部分地提取日期值。然而,当两天加在一起(例如,星期一+星期二=3)时,该特定示例不起作用。谁能给我指出正确的方向吗 仅供参考,我使用的是SQL Server 2008 R2。很抱歉,如果以前有人发布过,我看了一下,但找不到任何其他帖子。似乎你可以抓

关于特定整数字段存储数据的方式,我遇到了一些心理障碍

具体来说,有一列的整数范围为1-127;每个整数表示一周中不同天数的组合。例如:星期一=2^0或1,星期二=2^2或2,星期三=2^3或8;使用加法选项,星期一+星期二=3

我已经能够使用找到的示例部分地提取日期值。然而,当两天加在一起(例如,星期一+星期二=3)时,该特定示例不起作用。谁能给我指出正确的方向吗


仅供参考,我使用的是SQL Server 2008 R2。很抱歉,如果以前有人发布过,我看了一下,但找不到任何其他帖子。

似乎你可以抓住你需要的信息,将结果存储在他们自己的字段中,用于一周中的每一天

SELECT
    cast(day_of_week & 1 as bit) AS 'Monday',
    cast(day_of_week & 2 as bit) AS 'Tuesday',
    cast(day_of_week & 4 as bit) AS 'Wednesday',
    cast(day_of_week & 8 as bit) AS 'Thursday',
    etc...

您正在处理的是所谓的位运算符

下面是一个简单的例子

为了完整起见,以下是您所看到的内容,这些内容被分解为一周中每一天的各个列

DECLARE @bitwise TABLE (someValue TINYINT)

INSERT INTO @bitwise (someValue)
SELECT 1 UNION
SELECT 5 UNION
SELECT 127

SELECT someValue, CASE WHEN (1&someValue)=1 THEN 'SUNDAY' END
                , CASE WHEN (2&someValue)=2 THEN 'MONDAY' END
                , CASE WHEN (4&someValue)=4 THEN 'TUESDAY' END
                , CASE WHEN (8&someValue)=8 THEN 'WEDNESDAY' END
                , CASE WHEN (16&someValue)=16 THEN 'THURSDAY' END
                , CASE WHEN (32&someValue)=32 THEN 'FRIDAY' END
                , CASE WHEN (64&someValue)=64 THEN 'SATURDAY' END

FROM @bitwise

您很可能需要使用位运算符

SELECT *
FROM Table
WHERE DaysOfWeek & 3 = 3
或者,如果更有意义的话:

SELECT *
FROM Table
WHERE DaysOfWeek & 1 = 1
    AND DaysOfWeek & 2 = 2

我强烈建议您使用@jnevil descripes这样的查询创建视图。

该列使用位字段或位图,其中值中的每一位表示一天。这是正确的方向。你应该问问这个系统的“设计师”为什么选择这种方式(并提醒他们,现在已经不是70年代了)。@AaronBertrand我正在期待一篇“比特面具被认为是有害的”博文,现在。@BaconBits完美,这正是我想要的!