Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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]
> нужно смотреть на предметную область - возможно там лучше
> будет хранение по конкретной дате в отдельной записи

Ну это же высший пилотаж! Я и побоялся такое предложить -
ассоциативная связь (отношение "многие-ко-многим") между обсуждаемой таблицей и таблицей "дни недели"! :)


 
Ega23 ©   (2004-07-06 14:23) [41]

Ну это же высший пилотаж! Я и побоялся такое предложить -
ассоциативная связь (отношение "многие-ко-многим") между обсуждаемой таблицей и таблицей "дни недели"! :)

А, кстати, что смешного? В нашем проекте именно так и построено.


 
Курдль ©   (2004-07-06 14:23) [42]


> Соловьев ©   (06.07.04 14:16) [36]
> select *
> from table
> where extract(day from field_date) in (2,5,12,29,30)

Задача-то ставилась обратная! Не отобрать записи по датам, а отобрать записи, в которых указаны определенные дни недели.


 
Ega23 ©   (2004-07-06 14:23) [43]

В нашем проекте именно так и построено.
Не совсем так, конечно, но очень похоже.


 
Соловьев ©   (2004-07-06 14:25) [44]


> [42] Курдль ©   (06.07.04 14:23)

нет, как раз по дням месяца вопрос был [35]


 
Курдль ©   (2004-07-06 14:26) [45]


> Ega23 ©   (06.07.04 14:23) [41]
> А, кстати, что смешного? В нашем проекте именно так и построено.

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


 
Ega23 ©   (2004-07-06 14:30) [46]

А кто автор-то?  :о)
Я что-то уже совсем запутался...



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.053 c
14-1089997718
}|{yk
2004-07-16 21:08
2004.08.01
Все! Ухожу...


3-1087821905
Bulgar
2004-06-21 16:45
2004.08.01
Альтернатива базе данных


8-1084513139
Push
2004-05-14 09:38
2004.08.01
Installer


14-1089960179
Nikon777777
2004-07-16 10:42
2004.08.01
Реально ли написать программку?


14-1090096367
KilkennyCat
2004-07-18 00:32
2004.08.01
Встреча мастаков в 31-го в Выборге.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский