Модераторы: Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расчет количества выходных 
:(
    Опции темы
aleks88
Дата 1.2.2012, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



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


PM   Вверх
Deniz
Дата 1.2.2012, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



aleks88, а причем тут FireBird?
Если в хранимой процедуре, то нужно указать версию сервера, от этого многое зависит.
Можно использовать extract.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
aleks88
Дата 1.2.2012, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Версия сервера 2.1.4
Подскажите, как сделать следующее:
Есть поле с датой (Date), есть поле с количеством дней(Integer), есть некое бинарное поле [0,1] и есть расчитываемое поле.
Если банарное поле равно 0, то расчитываемое поле = поле с датой + количество дней.
Если бин. поле = 1, то расчитываемое поле = поле с датой + количество дней + количество выходных, выпадаемых за эти дни.

Совсем не представляю как это сделат.
Есть идея создавать файл Exel, там есть функция расчета числа рабочих дней между датами. Ииходя из этого, расчитывать все в Exe и читать программно в базу данных. Но веть это извращенство smile
PM   Вверх
AndreyIQ
Дата 1.2.2012, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: нет
Всего: 8



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

PM MAIL   Вверх
aleks88
Дата 1.2.2012, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Мне тоже это приходило, но корректно ли будет вычисляться дата, если скажем, найдет количеств выходных, прибавим к начальной дате и где то опять попадет на выходные ?

На сколько рационално испльзовать Exel ? Там есть встроенная функция, сдвигающая дату на определенное количество рабочих дней.
Т.е. выгрузили в файл Ексела дату и число дней, считали результат и записали в таблицу.
PM   Вверх
AndreyIQ
Дата 1.2.2012, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: нет
Всего: 8



Тогда лучше написать хранимую процедуру.
ЗЫ Про Excel забудьте
ЗЗЫ Возможно есть UDF'ки для вашей задачи
PM MAIL   Вверх
aleks88
Дата 1.2.2012, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Сложность в том, что с хранимыми процедурами не работал. :(
UDF это что ?
Почему про эксел забыть? В чем проблемы ?
PM   Вверх
aleks88
Дата 1.2.2012, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Подумал тут над хранимой процедурой. Неформальным языком должнобыть так:
1. Передать начальную дату и количество рабочих дней
2. Увеличиваем в цикле дату на 1 день и проверяем, выходной это или нет
3. если нет, то уменьшем количество рабочих дней на 1
4. как только количество рабочих дней станет равное нулю, выходим из цикла и возвращаем дату.

Я на верном пути ?
PM   Вверх
AndreyIQ
Дата 1.2.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: нет
Всего: 8



Через Excel делать это извращение, дикие тормоза и т.д.

Насчет, хранимой процедуры, Вы на верном пути.
PM MAIL   Вверх
Deniz
Дата 1.2.2012, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(aleks88 @  1.2.2012,  11:31 Найти цитируемый пост)
Я на верном пути?
Да.
Осталось только определить что есть выходной день? Суббота и воскресенье? Или добавить праздники?
Для праздников нужна отдельная таблица.
PS: UDF и Excel использовать не надо, достаточно хранимой процедуры.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Frees
Дата 1.2.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 1
Всего: 54



Цитата(Deniz @  1.2.2012,  14:00 Найти цитируемый пост)
использовать не надо, достаточно хранимой процедуры.

Код

CREATE OR ALTER PROCEDURE GET_WEEKEND_COUNT (
    DATE_FROM DATE,
    DATE_TO DATE)
RETURNS (
    WEEKEND_COUNT INTEGER)
AS
BEGIN
  WEEKEND_COUNT = 0;
  WHILE (DATE_FROM < DATE_TO) DO
  BEGIN
    DATE_FROM = DATE_FROM + 1;
    IF (EXTRACT(WEEKDAY FROM :DATE_FROM) IN (0, 6)) THEN --0,6 - ВРОДЕ выходные
      WEEKEND_COUNT = WEEKEND_COUNT + 1;
  END
  SUSPEND;
  --Доработать напильником
END



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
aleks88
Дата 1.2.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Эх, тяжко с налету что то делать ...
Благодарю всех за содействие! Буду разбираться в процедуре! smile

PM   Вверх
Deniz
Дата 1.2.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Frees, там задача немного поменялась.
Очень похожа на задачу определения дня выхода на работу из отпуска.
PS: процедуру писать не буду, пусть автор сам немного поразмыслит, тем более пример уже дан.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 1.2.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(aleks88 @  1.2.2012,  05:01 Найти цитируемый пост)
вычисляемый стобец, использующий в котором прибавляется к дате количество дней.

сам хоть понял, что написал?
PM MAIL   Вверх
aleks88
Дата 1.2.2012, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.8.2011

Репутация: нет
Всего: нет



Цитата(Akella @ 1.2.2012,  14:45)
Цитата(aleks88 @  1.2.2012,  05:01 Найти цитируемый пост)
вычисляемый стобец, использующий в котором прибавляется к дате количество дней.

сам хоть понял, что написал?

Виноват, казус smile

Цитата(Deniz @ 1.2.2012,  12:22)
Frees, там задача немного поменялась.
Очень похожа на задачу определения дня выхода на работу из отпуска.
PS: процедуру писать не буду, пусть автор сам немного поразмыслит, тем более пример уже дан.

Да, заметил что задача немногим отличается, но не существенно...
Вот, плод моих скудных размышлений, все верно ? На мой взгляд да, дата сдвигается на число рабочих дней (под рабочими понимаем все кроме СБ и ВС).

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


Код

CREATE PROCEDURE DATE_COLCULATION (DATE_FROM DATE, DAYS INTEGER)
RETURNS ( DATE_TO DATE )
AS
BEGIN
  WHILE(DAYS > 0) DO
  BEGIN
    DATE_FROM = DATE_FROM + 1;
    IF (EXTRACT(WEEKDAY FROM :DATE_FROM) IN (1,2,3,4,5)) 
    THEN DAYS=DAYS-1;
  END
DATE_TO=DATE_FROM;
  SUSPEND;
END  

    


Это сообщение отредактировал(а) aleks88 - 1.2.2012, 18:17
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.