powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
6 сообщений из 6, страница 1 из 1
Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
    #36464425
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Есть 2 таблицы с одинаковой структурой:
settings_workdays и custom_workdays. В обоих есть поля WDate типа DateTime и WDuration(int).
В таблице settings_workdays есть 5 записей с датой от 2001 года, с 1го по 5е января, в них главное - время, а не дата.
+ Еще таблица Calendar в которой:
есть поле Date типа Date и Holiday (int) (если 1 - значит выходной)

Входящий параметр m.ldCheckDate - проверяемая дата, типа Date.
Результат выборки - записи или их отсутствие в виде таблицы/курсора с двумя полями: WDate (DateTime) и WDuration(int).

Нужно сделать выборку по входящему_параметру-дате, чтобы
1) учесть нет ли записи в Calendar с этой датой (поле Date) со значением 1 в поле Holiday, т.е. не выходной ли переданная дата, и в этом случае результат выборки должен быть пустым
2) если дата не выходной по Calendar и если дата есть в таблице custom_workdays, то сделать выборку записей только из этой таблицы (поля WDate, WDuration) и всё
3) если дата не выходной по Calendar и если даты нет в таблице custom_workdays, то делаем выборку записей из таблицы settings_workdays (поля WDate, WDuration) по условию DAYOFWEEK(входящего_параметра-даты)=DAYOFWEEK(settings_workdays.WDate)

вот так не выдает в выборку вообще ничего:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT
NVL(Custom_WorkDays.WDate,Settings_WorkDays.WDate) as WDate,
NVL(Custom_WorkDays.WDuration,Settings_WorkDays.WDuration) as WDuration 
FROM Custom_WorkDays
LEFT JOIN Settings_WorkDays ON DOW(Settings_WorkDays.WDate)=DOW(m.ldCheckDate)
WHERE TTOD(Custom_WorkDays.WDate)=m.ldCheckDate 
AND m.ldCheckDate NOT IN(SELECT Date FROM Calendar WHERE Date=m.ldCheckDate AND Holiday= 1 )
ORDER BY WDate
хотя мною ожидается 1 запись из Settings_WorkDays, поскольку там есть одна удовлетворяющая условию DOW(Settings_WorkDays.WDate)=DOW(m.ldCheckDate)

заранее спасибо!
...
Рейтинг: 0 / 0
Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
    #36464537
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT;
     Settings_WorkDays.WDate,;
     Settings_WorkDays.WDuration;
  FROM Settings_WorkDays;
  LEFT JOIN Custom_WorkDays ON TTOD(Custom_WorkDays.wDate)=m.ldCheckDate;
  WHERE Custom_WorkDays.wDate IS NULL;
     AND DOW(Settings_WorkDays.wDate)=DOW(m.ldCheckDate);
     AND m.ldCheckDate NOT IN(SELECT Date FROM Calendar WHERE Date=m.ldCheckDate AND Holiday= 1 );
UNION;
  SELECT;
     Custom_WorkDays.WDate,
     Custom_WorkDays.WDuration;
  FROM Custom_WorkDays;
  WHERE TTOD(Custom_WorkDays.WDate)=m.ldCheckDate;
     AND m.ldCheckDate NOT IN(SELECT Date FROM Calendar WHERE Date=m.ldCheckDate AND Holiday= 1 );
ORDER BY wDate
смысл в том, что первый селект не возвращает записи, если подходящие есть в Custom_WorkDays и наоборот. Однако что-то мне кажется этот запрос можно оптимизировать, особенно вот эту часть:
Код: plaintext
AND m.ldCheckDate NOT IN(SELECT Date FROM Calendar WHERE Date=m.ldCheckDate AND Holiday= 1 )
подскажите как?
...
Рейтинг: 0 / 0
Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
    #36464949
quxix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CTAC-KO,
данных дайте
...
Рейтинг: 0 / 0
Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
    #36465017
quxix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CTAC-KOПривет!
Есть 2 таблицы с одинаковой структурой:
settings_workdays и custom_workdays. В обоих есть поля WDate типа DateTime и WDuration(int).
В таблице settings_workdays есть 5 записей с датой от 2001 года, с 1го по 5е января, в них главное - время, а не дата.
+ Еще таблица Calendar в которой:
есть поле Date типа Date и Holiday (int) (если 1 - значит выходной)

Входящий параметр m.ldCheckDate - проверяемая дата, типа Date.
Результат выборки - записи или их отсутствие в виде таблицы/курсора с двумя полями: WDate (DateTime) и WDuration(int).

Нужно сделать выборку по входящему_параметру-дате, чтобы
1) учесть нет ли записи в Calendar с этой датой (поле Date) со значением 1 в поле Holiday, т.е. не выходной ли переданная дата, и в этом случае результат выборки должен быть пустым
2) если дата не выходной по Calendar и если дата есть в таблице custom_workdays, то сделать выборку записей только из этой таблицы (поля WDate, WDuration) и всё
3) если дата не выходной по Calendar и если даты нет в таблице custom_workdays, то делаем выборку записей из таблицы settings_workdays (поля WDate, WDuration) по условию DAYOFWEEK(входящего_параметра-даты)=DAYOFWEEK(settings_workdays.WDate)


не знаю,так попробуйте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
NVL(cst.WDate,sets.WDate) as WDate,
NVL(cst.WDuration,sets.WDuration) as WDuration 
FROM Calendar cal
left join Custom_WorkDays cst 
on cal.date=cst.wdate
Left join settings_workdays sets 
on dow(cal.date)=dow(sets.wdate)
where holiday=m.ldCheckDate
...
Рейтинг: 0 / 0
Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
    #36465023
quxix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поправил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
NVL(cst.WDate,sets.WDate) as WDate,
NVL(cst.WDuration,sets.WDuration) as WDuration 
FROM Calendar cal
left join Custom_WorkDays cst 
on cal.date=cst.wdate
Left join settings_workdays sets 
on dow(cal.date)=dow(sets.wdate)
where cal.holiday<> 1 
and cal.date=m.ldCheckDate
...
Рейтинг: 0 / 0
Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
    #36465776
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое Вам спасибо, работает!
попробую в свободное время разобраться в смысле.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите хитрую SQL-выборку по дате/DOW() из 3х таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]