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

时间:2015-09-01 20:25:40

标签: sql sql-server-2008 date

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

具体来说,有一个整数的列,范围从1到127;每个整数表示一周中不同日期的组合。例如:星期一= 2 ^ 0或1,星期二= 2 ^ 2或2,星期三= 2 ^ 3或8;可选择添加,周一+周二= 3。

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

仅供参考,我使用的是SQL Server 2008 R2。我很抱歉,如果之前已经发布过,我看了看但却无法找到任何其他帖子。

3 个答案:

答案 0 :(得分:2)

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

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...

答案 1 :(得分:2)

您正在处理的内容称为按位运算符。

这里有good read,上面有简单明了的例子。

为了完整起见,以下是您在每周的每一天分解为列的内容。

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

答案 2 :(得分:0)

您最需要使用按位运算符。

SELECT *
FROM Table
WHERE DaysOfWeek & 3 = 3

或者,如果它更有意义:

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

我强烈建议您使用@JNevill描述的查询创建一个VIEW。