sql сохранить логические поля месяца как целое число для побитовой манипуляции - PullRequest
0 голосов
/ 08 ноября 2018

Вероятно, обдумывая это. Проблема в том, что я унаследовал базу данных, в которой член может иметь два (или более) адреса как часть членской (думаю, сезонной) записи (адреса находятся в отдельных записях), а действия базы данных зависят от того, по какому адресу в данный момент находится участник.

В настоящее время каждый месяц (январь, февраль и т. Д.) Является битовым полем. Таким образом, чтобы запросить, где находится член в этом месяце (или интервале месяцев), вы должны выбрать либо имя поля, которое соответствует текущему месяцу (или интервалу месяца для периода), то есть вы должны выполнить запрос по имени поля переменной ... или сканировать через 12 полей - неуклюжий. Мне кажется, это должно быть либо целочисленное поле, которое запрашивается с помощью битовой операции xor (одно для которого помечены месяцы, а другое - для периода запроса), либо путем "добавления" значений поля в строку битов, преобразованную в целое число, а затем с использованием побитовое сравнение.

Второй вариант будет в порядке (не изменит структуру таблицы), но будет использовать одно целочисленное поле для представления двоичной версии за 12 месяцев, а затем работать с этим.

В любом случае прошло слишком много лет с тех пор, как я проделал большую побитовую работу, а тем более не придумал, как преобразовать в двоичное представление. Я ожидаю, что где-то уже есть опубликованный ответ, но не могу его найти. Какие-либо предложения? Спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

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

alter table myTable
add column MonthNum int

alter table myTable
add constraint CK_Month_Range CHECK (MonthNum > 0 and MonthNum < 13)

Сохранение битового представления месяца не принесет никакой пользы.число в целочисленном поле, поскольку будет занято такое же количество места (4 байта).Многие системные таблицы используют побитовые значения, но в этом случае я не вижу, как это могло бы улучшить что-либо.

Чтобы проверить, есть ли они, я, вероятно, сделал бы одну из двух вещей.

  • Использовать столбец значений bit для IsCurrent
  • Использовать форму управления версиями строк, где последней обновленной датой-временем будет текущая запись

Вот побитовый тип проверки, будет ли ваше приложение отправлять целое число для параметра

declare @table table (id int identity(1,1), jan bit, feb bit, mar bit, apr bit, may bit, jun bit, jul bit, aug bit, sep bit, oct bit, nov bit, [dec] bit)

insert into @table
values
(0,0,0,0,0,0,0,1,0,0,0,0), --aug
(0,0,1,0,0,0,0,0,0,0,0,0), --mar
(0,0,0,0,0,0,0,0,0,0,0,1), --dec
(1,0,0,0,0,0,0,0,0,0,0,0)   --jan


declare @month int = 3

select *, bitwise = concat(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,[dec])
from @table
where charindex('1',concat(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,[dec])) = @month

Если они передаются в виде строк, например «Январь», тогда вы просто присоединитесь к таблице поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...