Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизДни недели Найти похожие ветки
← →
Iddqd © (2004-07-06 11:27) [0]Уважаемые мастера, помогите решить следующую задачу:
В таблице есть строковое поле "DAYS" в формате : пвсчпсв (обозначающее соотвественно понедельник, вторник и т.д). Оно может принимать значения : п_сч_св или _____св и т.д. Пользователь в программе выбирает с помощью чекбоксов нужные дни недели и соотвественно должны отразиться те записи которые включают эти дни. Пока это решено на уровне самой программы. Т.е выбираются все записи а уж потом не нужные отсеиваются. Как сделать подобное в SQL запросе.
← →
Соловьев © (2004-07-06 11:38) [1]select *
from table
where days like "п_сч_св"
← →
Соловьев © (2004-07-06 11:39) [2]не-а :)
ИМХО, надо было структуру сделать таблицы нормальной где ввести 7 логических полей.
← →
Iddqd © (2004-07-06 11:44) [3]"Like" не пойдет. Например юзер выбрал "пвсч_с_" , тогда блок с плок со значением "_в_с___в" должен отобразиться
← →
Johnmen © (2004-07-06 11:47) [4]"пвсч_с_" :
(DAYS LIKE "п______") OR
(DAYS LIKE "_в_____") OR
(DAYS LIKE "__с____") OR
(DAYS LIKE "___ч___") OR
(DAYS LIKE "_____с_")
← →
Наталия © (2004-07-06 11:49) [5]Тогда придется делать какую-то имитацию семи логических полей :))
Что-то типа substr(days,1,1), substr(days,2,1) и т.п. (не знаю только как в MSSQL называется функция, выделяющая из строки подстроку)
← →
Fay © (2004-07-06 12:27) [6]Хранить 1 байт как флаговый. 1 = п, 5 = п_с____ и т.д.
← →
Курдль © (2004-07-06 12:30) [7]
> Iddqd © (06.07.04 11:27)
> Уважаемые мастера, помогите решить следующую задачу:
> В таблице есть строковое поле "DAYS" в формате : пвсчпсв
> (обозначающее соотвественно понедельник, вторник и т.д).
> Оно может принимать значения : п_сч_св или _____св и т.д.
> Пользователь в программе выбирает с помощью чекбоксов нужные
> дни недели и соотвественно должны отразиться те записи которые
> включают эти дни.
Это придумано из мазохистских соображений? :0)
Ответ [2] полностью решит Вашу проблему! Тогда на каждое поле можно навесить DBCheckBox, а в продвинутых гридах типа dxDBGrid или DBGridEh индицировать дни недели в виде колонок с CheckBox-ами.
← →
Fay © (2004-07-06 12:33) [8]2Курдль © (06.07.04 12:30) [7]
> Ответ [2] полностью решит Вашу проблему
.. пока не появятся "с_в_пп_". Не знаю как 8). Просто такие значения притиворечат 1нф
← →
Iddqd © (2004-07-06 12:48) [9]// пока не появятся "с_в_пп_"
Такое не может появиться.
← →
Sandman25 © (2004-07-06 12:50) [10][9] Iddqd © (06.07.04 12:48)
У Вас триггер есть или check constraint какой-нибудь?
← →
Iddqd © (2004-07-06 12:56) [11]Cпасибо Наташе. Делаю по ее совету. Допустим пользователь выбрал:
понед, вторн, четверг и субб. Тогда формируем строку t:="пв-ч-с-", умышленно меня символ "_" на "-". Получаем запрос
SELECT ... FROM ...
WHERE ...
AND SUBSTRING(DAYS,1,1)="+QuotedStr(t[1]));
OR SUBSTRING(DAYS,2,1)="+QuotedStr(t[2]));
OR SUBSTRING(DAYS,3,1)="+QuotedStr(t[3]));
OR SUBSTRING(DAYS,4,1)="+QuotedStr(t[4]));
OR SUBSTRING(DAYS,5,1)="+QuotedStr(t[5]));
OR SUBSTRING(DAYS,6,1)="+QuotedStr(t[6]));
OR SUBSTRING(DAYS,7,1)="+QuotedStr(t[7]));
PS. Спасибо всем. Извените за это извращение
← →
Fay © (2004-07-06 12:59) [12]Что это за страсть!? Ты читал про LIKE в MSSQL?
← →
Iddqd © (2004-07-06 13:04) [13]Про LIKE читал. А что конкретно ты предлагаешь?
← →
Курдль © (2004-07-06 13:05) [14]
> Fay © (06.07.04 12:33) [8]
> .. пока не появятся "с_в_пп_". Не знаю как 8). Просто такие
> значения притиворечат 1нф
Как это?
Вот фрагмент таблицы:
DAY_MON logical Not Null;
DAY_TUE logical Not Null;
DAY_WED logical Not Null;
DAY_THU logical Not Null;
DAY_FRY logical Not Null;
DAY_SAT logical Not Null;
DAY_SUN logical Not Null;
Любое из полей может принимать любое значение (False, True).
И причем здесь "с_в_пп_"?
← →
Fay © (2004-07-06 13:11) [15]2Курдль © (06.07.04 13:05) [14]
Ошибся. Перепутал [1] с [2]. [2] - терпимо, но в MSSQL есть битовые операции (см. [8])
2Iddqd © (06.07.04 13:04) [13]
см. [1]
← →
Соловьев © (2004-07-06 13:13) [16]
> терпимо, но в MSSQL есть битовые операции
мне кажется для наглядности лучше 7 полей:)
← →
Fay © (2004-07-06 13:16) [17]2Соловьев © (06.07.04 13:13) [16]
Для юзера - да. Но ему не обязательно знать структуру базы.
← →
Курдль © (2004-07-06 13:17) [18]
> Соловьев © (06.07.04 13:13) [16]
> мне кажется для наглядности лучше 7 полей:)
А главное, что не требует никакой обработки ни при вводе, ни при выводе, ни для поддержания целостности (если, например, хоть один день недели должен быть выбран - решается простым constraint-ом БД).
← →
Соловьев © (2004-07-06 13:19) [19]
> Для юзера - да
нет, для разработчика
← →
Fay © (2004-07-06 13:24) [20]2Курдль © (06.07.04 13:17) [18]
constraint CK_ТоФлаговоеПоле check(ТоФлаговоеПоле > 0)
← →
Ega23 © (2004-07-06 13:25) [21]Type
TWeekDay=(wdMon, wdTue, wdWed, wdThr, wdFri, wdSut, wdSun)
TDaysOfWeek=set of TWeekDay
function DaysOfWeekToInt(const Value: TDaysOfWeek): Integer;
begin
Result:=0;
if (wdMon in Value) then Result:=Result or 1;
if (wdTue in Value) then Result:=Result or 2;
if (wdWed in Value) then Result:=Result or 4;
if (wdThr in Value) then Result:=Result or 8;
if (wdFri in Value) then Result:=Result or 16;
if (wdSut in Value) then Result:=Result or 32;
if (wdSun in Value) then Result:=Result or 64;
end;
function IntToDaysOfWeek(const Value: integer): TDaysOfWeek;
begin
Result:=[];
if ((Value shr 0) and 1)=1 then Result:=Result+[wdMon];
if ((Value shr 1) and 1)=1 then Result:=Result+[wdTue];
if ((Value shr 2) and 1)=1 then Result:=Result+[wdWed];
if ((Value shr 3) and 1)=1 then Result:=Result+[wdThr];
if ((Value shr 4) and 1)=1 then Result:=Result+[wdFri];
if ((Value shr 5) and 1)=1 then Result:=Result+[wdSut];
if ((Value shr 6) and 1)=1 then Result:=Result+[wdSun];
end;
А в базе одно поле типа int.
И ВСЁ.
← →
Курдль © (2004-07-06 13:26) [22]
> Fay © (06.07.04 13:24) [20]
> 2Курдль © (06.07.04 13:17) [18]
> constraint CK_ТоФлаговоеПоле check(ТоФлаговоеПоле > 0)
Это о чем :( Я не понял, можно конкретнее?
← →
Fay © (2004-07-06 13:28) [23]2Ega23 © (06.07.04 13:25) [21]
Не, не поймут. Хорошо ещё речь идет не о числах месяца 8)
← →
Iddqd © (2004-07-06 13:28) [24]2Fay
DAYS LIKE "_в__п_в" выводит только одну запись "пвсчпсв" хотя
запись "пвсчп__" тоже должна выводиться
← →
Fay © (2004-07-06 13:32) [25]2Iddqd © (06.07.04 13:28) [24]
DAYS LIKE "[_]в[_][_]п[_]в"
← →
Ega23 © (2004-07-06 13:44) [26]Не, не поймут. Хорошо ещё речь идет не о числах месяца 8)
Кто не поймёт? Автор вопроса? :о)
← →
Fay © (2004-07-06 13:57) [27]2Ega23 © (06.07.04 13:44) [26]
Те, кто предлагает создать кучу полей.
← →
Ega23 © (2004-07-06 13:59) [28]Не, не поймут. Хорошо ещё речь идет не о числах месяца 8)
Числа месяца, кстати, тоже отлично в int влезут :о)
← →
Fay © (2004-07-06 14:02) [29]Но 31 поле намного нагляднее 8)
← →
Ega23 © (2004-07-06 14:03) [30]Fay © (06.07.04 14:02) [29]
Само собой. :-)
← →
Ega23 © (2004-07-06 14:03) [31]Fay © (06.07.04 14:02) [29]
Само собой. :-)
← →
Курдль © (2004-07-06 14:06) [32]
> Fay © (06.07.04 13:57) [27]
> Те, кто предлагает создать кучу полей.
> Ega23 © (06.07.04 13:59) [28]
> Не, не поймут. Хорошо ещё речь идет не о числах месяца 8)
> Числа месяца, кстати, тоже отлично в int влезут :о)
7 и даже 31 - это не "куча". У СУБД от 31 поля типа SmallInt(а чаще всего так интерпретируется логическое поле) харя не треснет.
Однако, 31 CheckBox не сильно украсит пользовательский интерфейс.
И еще - по моим наблюдениям многие реплики на форуме проходят не под лозунгом "я знаю, как лучше", а "я придумал еще один прикольный способ!"
← →
Соловьев © (2004-07-06 14:09) [33]действительно для дней нет смысла создавать поля:)
нужно смотреть на преметную область - возможно там лучше будет хранение по конкретной дате в отдельной записи
← →
Соловьев © (2004-07-06 14:13) [34]
> Однако, 31 CheckBox не сильно украсит пользовательский интерфейс
это да:)
думаю лучшим способом в таком случае будет что-то типа календаря где с Ctrl можно выделить несколько дат.
← →
Fay © (2004-07-06 14:13) [35]2Курдль © (06.07.04 14:06) [32]
Не согласитесь привести пример запроса по числам месяца?
← →
Соловьев © (2004-07-06 14:16) [36]
> Не согласитесь привести пример запроса по числам месяца?
select *
from table
where extract(day from field_date) in (2,5,12,29,30)
← →
Ega23 © (2004-07-06 14:17) [37]7 и даже 31 - это не "куча". У СУБД от 31 поля типа SmallInt(а чаще всего так интерпретируется логическое поле) харя не треснет.
Однако, 31 CheckBox не сильно украсит пользовательский интерфейс.
Если уж надо инфу по дням делать, то тогда нужна ещё одна таблица соответствия.
Однако, 31 CheckBox не сильно украсит пользовательский интерфейс.
Это точно, но могу дать ситуацию, где от этого не уйти.
← →
Fay © (2004-07-06 14:19) [38]2Соловьев © (06.07.04 14:16) [36]
1) не extract, а DatePart
2) я имел ввиду запрос с участием 31-го поля в where
← →
Ega23 © (2004-07-06 14:19) [39]select *
from table
where extract(day from field_date) in (2,5,12,29,30)
extract - это что?
← →
Курдль © (2004-07-06 14:20) [40]
> Fay © (06.07.04 14:13) [35]
> Не согласитесь привести пример запроса по числам месяца?
select * from TABLE1
where DAY_01 = True
and DAY_01 = True
and DAY_02 = False
and DAY_03 = False
...
and DAY_31 = True
> Соловьев © (06.07.04 14:09) [33]
> нужно смотреть на предметную область - возможно там лучше
> будет хранение по конкретной дате в отдельной записи
Ну это же высший пилотаж! Я и побоялся такое предложить -
ассоциативная связь (отношение "многие-ко-многим") между обсуждаемой таблицей и таблицей "дни недели"! :)
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.031 c