Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как отсчитать несколько рабочих дней от текущей даты / 15 сообщений из 15, страница 1 из 1
18.01.2002, 07:08
    #32020953
AlexanderVS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Есть таблица в которой перечисленны все дни на несколько лет. Пользователь сам отмечает в этом календаре выходные и праздничные дни. Имеем текущую дату, необходимо получить, например, дату через 10 РАБОЧИХ дней. Я решил это через SP:
---------------
set @ND=10
set @Dt='10.01.02'
set@q = 'insert #D select max(Date_) from Calendar where Date_ IN (
Select top ' + @ND + ' Date_ From Calendar where Work_=255 and Date_ > ''' + @Dt + ''' order by date_)'
Exec (@Q)
----------------
Далее, в другой SP, эта дата извлекается из #D
Хотелось бы перенести это в UDF, которая возвращала бы нужную дату.
...
Рейтинг: 0 / 0
18.01.2002, 08:13
    #32020962
Dikobrazz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Принцип такой: находим дату, большую заданной, для которой количество таких записей равно требуемому числу дней. Звучит несколько путанно, в SQL это должно выглядеть так:
select @result=t1.date_
FROM Calendar t1
join Calendar t2 on t2.date_<t1.date_
where t2.date_>=@Dt and t2.work_=255 and t1.work_=255
group by t1.date_
having count(*)=@ND
...
Рейтинг: 0 / 0
18.01.2002, 09:24
    #32020968
AlexanderVS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Вот блин, РАБОТАЕТ!
Но очень медленно, "having count(*)" - жутко тормозит.
...
Рейтинг: 0 / 0
18.01.2002, 14:03
    #32020990
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
количество перебираемых значений можно сократить если учесть что в среднем количество рабочих дней равно 5/7 от количества календарных. Если поставить дополнительные условия по датам, это должно сильно ускорить.
...
Рейтинг: 0 / 0
18.01.2002, 19:31
    #32021021
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Я бы в данном случае использовал ненавидимый мною курсор. Просто тупо отсчитал бы нужное количество дней, пропуская выходные.
...
Рейтинг: 0 / 0
18.01.2002, 19:31
    #32021022
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Я бы в данном случае использовал ненавидимый мною курсор. Просто тупо отсчитал бы нужное количество дней, пропуская выходные.
...
Рейтинг: 0 / 0
20.01.2002, 14:06
    #32021050
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
2 AlexanderVS:

Если Вам удастся:
1. Добавить в таблицу индексированное поле с монотонно возрастающим значением.
2. Корректно вести его. Например, с помощью хранимой процедуры.

То запросы будут "летать":
select date_ from calendar where Id = (select Id from calendar where date_ = @дата) + @количество_дней
...
Рейтинг: 0 / 0
21.01.2002, 09:34
    #32021073
AlexanderVS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
2MadDog
-------------------------------------------------------
select date_ from calendar where Id = (select Id from calendar where date_ = @дата) + @количество_дней
-------------------------------------------------------
Чегой то я не въезжаю, объясни плиз, а как тогда таким запросом праздничные и выходные дни обойти, ведь мне нужны ТОЛЬКО РАБОЧИЕ ДНИ.
...
Рейтинг: 0 / 0
21.01.2002, 10:36
    #32021080
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Попытаюсь объяснить за MadDog(во всяком случае как я понял его идею)
В таблице Calendar добавляется еще одно поле(Х) - количество рабочих дней от какой-то определённой даты(например от вашего дня рождения). Это поле высчитывается каждый раз когда добавляется новая запись. У нерабочих дней там ставиться null.
Чтобы узнать какая дата будет через N рабочих дней, надо взять значение поля Х для заданной даты, прибавить N и найти запись с полученным значением у поля Х. Дата у этой записи и будет искомой датой.
...
Рейтинг: 0 / 0
21.01.2002, 11:05
    #32021081
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Либо я ничего не понимаю, но у меня получается так

declare @nd int, @dt datetime, @mysql nvarchar(4000)
set @ND=10
set @Dt='20020301'

set @mysql = N'SELECT MAX(date_) AS newdate FROM(SELECT TOP '+CAST(@nd AS varchar)+ ' date_ from calendar a where a.work_ = 255 and a.date_ > ''' +CONVERT(varchar, @dt, 112)+''' order by date_) AS a'
exec(@mysql)
...
Рейтинг: 0 / 0
21.01.2002, 11:45
    #32021089
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Господа, прошу прощения. Я выслал недоделанное сообщение. Перед тем как сделать preview first скопировал тест, но, похоже, не весь.

У меня ДВЕ таблицы, одна - весь календарь, другая - только рабочие дни. "индексированное поле с монотонно возрастающим значением" находится во второй таблице. Под фразой "Корректно вести его" я подразумевал синхронизацию этих таблиц.
...
Рейтинг: 0 / 0
21.01.2002, 14:20
    #32021121
AlexanderVS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Господа, господа, Вы уклоняетесь от темы
Во первых у меня и так все работает в SP при наличии одной таблицы - посмотрите начало топика
Во вторых то что предложил уважаемый Glory - те же яйца, только в профиль. Я имею в виду в конечном счете EXEC(@mysql)
В третьих я просто хотел перенести код SP в UDF, поэтому EXEC(@mysql) тут не проходит.
Но все равно - спасибо за ответы!
ЗЫ А вот еще можно попутно узнать: я часто слышу термин - "переодическое обновление индекса", а как это делается я почему то не знаю
...
Рейтинг: 0 / 0
21.01.2002, 14:53
    #32021128
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Уточню на всякий случай
Вам нужно именно UDF или возможность вернуть из динамического запроса значение ?
...
Рейтинг: 0 / 0
21.01.2002, 15:05
    #32021129
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Ну а насчет "те же яйца, только в профиль".
Сравните, если интересно, планы выполнения вашего и моего запросов - увидите в чем различие. Хотя на такой маленькой таблице конечное время обеих запросов различается мало.
...
Рейтинг: 0 / 0
22.01.2002, 02:17
    #32021155
AlexanderVS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отсчитать несколько рабочих дней от текущей даты
Уважаемый товарисч Glory !!!
Я ни в коем случае не хотел Вас обидеть сравнив Ваш пример со своим. ОНИ РАЗНЫЕ! И скорее всего, Ваш код быстрее и оптимальнее. Но реализация его через EXEC(@sql) - в UDF не проходит, а я хотел именно UDF.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как отсчитать несколько рабочих дней от текущей даты / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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