【问题标题】:Multiple days of week stored in one field一周中的多天存储在一个字段中
【发布时间】:2015-09-01 20:25:40
【问题描述】:

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

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

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

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

【问题讨论】:

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

标签: sql sql-server-2008 date


【解决方案1】:

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

这是一个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】:

您似乎可以只获取所需的部分并将结果存储在他们自己的字段中,用于一周中的每一天。

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

【讨论】:

    【解决方案3】:

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

    SELECT *
    FROM Table
    WHERE DaysOfWeek & 3 = 3
    

    或者,如果它更有意义:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多