2015-09-01 4 views
0

Я столкнулся с ментальным контрольным блоком относительно того, как определенное целочисленное поле хранит данные.Несколько дней недели, хранящихся в одном поле

В частности, имеется столбец с целыми числами от 1 до 127; каждое целое число представляет собой комбинацию разных дней недели. Например: понедельник = 2^0 или 1, вторник = 2^2 или 2, среда = 2^3 или 8; с возможностью добавления, понедельник + вторник = 3.

Я смог частично извлечь значения даты, используя пример, найденный here. Однако этот конкретный пример не работает, когда два дня объединяются (например, понедельник + вторник = 3). Может кто-то указать мне верное направление?

FYI, я использую SQL Server 2008 R2. Мои извинения, если это было опубликовано раньше, я взглянул, но не смог найти никаких других сообщений.

+0

В этой колонке используется битное поле или растровое изображение, где каждый бит в значении представляет день. Это правильное направление. – Amit

+0

Вы должны спросить «дизайнеров» этой системы, почему они выбрали этот способ (и напоминают им, что это не 70-е годы). –

+0

@AaronBertrand Я ожидаю, что сообщение в блоге «Битмакс считается вредным». –

ответ

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 
+0

Отлично, это именно то, что я искал! – TheTrashMan

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

Вам, скорее всего, понадобятся побитовые операторы.

SELECT * 
FROM Table 
WHERE DaysOfWeek & 3 = 3 

Или, если это имеет смысл:

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

Я настоятельно рекомендую вам создать VIEW с запросом, как @JNevill описывает.

Смежные вопросы