powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / банковские дни
12 сообщений из 12, страница 1 из 1
банковские дни
    #32074126
Irine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо отсчитать конкретное количество банковских дней bank_days
от текущей даты curr_date, используя календарь (таблицу):
date hour type
01/01/2002 0 0 выходной
01.02.2002 8 1 рабочий
...
08.03.2002 0 2 праздничный,
т.е. вычитаться должны только рабочие дни, а
выходные и праздничные - нет
...
Рейтинг: 0 / 0
банковские дни
    #32074128
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с тридцатидневкой в феврале как поступается?
...
Рейтинг: 0 / 0
банковские дни
    #32074132
Irine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to VVG
Все это хранится в таблице "календарь", которая формируется
особым образом. Главное, что именно в ней видно то, что считается
банковскими днями
...
Рейтинг: 0 / 0
банковские дни
    #32074145
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я ничего не понимаю с такой таблицей.. В далекие времена, когда мне нужно было равсчитывают рабочие дни, для месяца просто выделялось 4 байта (int) и побитово метились рабочие-нерабочие дни. Мне хватало 32-х возможных дней, если мало возьмете 8 байтов. Далее с помощью простых битовых операций можно было рассчитать количество любых дней в любом интервале.. Ну попровочка там еще была на феврал высокосного года. А как даже не знаю.. А если из 14 нерабочих, 10 приходятся на первые две недели, на что ориентироваться?
...
Рейтинг: 0 / 0
банковские дни
    #32074149
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-нибудь так наверное:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure bank_day_diff 
@curr_date datetime,@days datetime
as
set nocount on
set rowcount @days
declare @new_date datetime
select @new_date=date from bank_days where type= 1  
where date>@curr_date
order by date
select @new_date
GO
...
Рейтинг: 0 / 0
банковские дни
    #32074151
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там @days int, сори.
...
Рейтинг: 0 / 0
банковские дни
    #32074154
Фотография KIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
set nocount on
create table #calendar( DayDate datetime, DayHour int, DayType int)
go

insert into #calendar values( '20011231', 0 , 1 )
insert into #calendar values( '20020101', 0 , 0 )
insert into #calendar values( '20020102', 0 , 1 )
insert into #calendar values( '20020103', 0 , 1 )
insert into #calendar values( '20020104', 0 , 1 )
 --insert into #calendar values( %af_src_str_5,0,1)
 
insert into #calendar values( '20020106', 0 , 1 )
insert into #calendar values( '20020107', 0 , 1 )
insert into #calendar values( '20020108', 0 , 1 )
go

declare @CurrentDate datetime, @CalcDate datetime

select @CurrentDate='20020101', @CalcDate='20020110'

select count(DayDate)
from #calendar
where DayType= 1  AND
      DayDate < @CalcDate AND
      DayDate>( select max(DayDate)
                from #calendar
                where DayDate<=@CurrentDate )

drop table #calendar
go

 -- знак < или > зависит от того, куда считаем, назад или вперед
 
 -- Кроме того все эти навороты с подзапросом только из-за предупреждения случая
 
 -- выполнения данного запроса в нерабочий день и предупреждения отсутствия в календаре текущей даты 
 
 --
 
...
Рейтинг: 0 / 0
банковские дни
    #32074159
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, и обратная задача подоспела.

P.S. Питерское дерби какое-то.
...
Рейтинг: 0 / 0
банковские дни
    #32074167
Irine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to KIM
Думаю теперь, а как же перейти к обратной-то задачке:
у меня -то даны тек. дата и кол-во банковских дней,
которые надо отнять от текущей, чтобы получить
искомую дату
...
Рейтинг: 0 / 0
банковские дни
    #32074203
Фотография KIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
set nocount on
create table tmp_calendar( DayDate datetime, DayHour int, DayType int)
go
insert into tmp_calendar values( '20011229', 0 , 1 )
insert into tmp_calendar values( '20011230', 0 , 1 )
insert into tmp_calendar values( '20011231', 0 , 1 )
insert into tmp_calendar values( '20020101', 0 , 0 )
insert into tmp_calendar values( '20020102', 0 , 1 )
insert into tmp_calendar values( '20020103', 0 , 1 )
insert into tmp_calendar values( '20020104', 0 , 1 )
 --insert into tmp_calendar values( %af_src_str_7,0,1)
 
insert into tmp_calendar values( '20020106', 0 , 1 )
insert into tmp_calendar values( '20020107', 0 , 1 )
insert into tmp_calendar values( '20020108', 0 , 1 )

declare @CurrentDate datetime, @CountDay int, @s nvarchar( 255 )

create table #tmp( DayDate datetime)

select @CurrentDate='20020108', @CountDay= 3 

select @s = 'select top ' + 
            CONVERT(varchar( 10 ),@CountDay) + 
            ' DayDate from tmp_calendar where DayDate < '''+
            CONVERT(varchar( 20 ),@CurrentDate, 112 ) +
            ''' and DayType=1 order by DayDate desc' 

insert into #tmp execute sp_executesql @s

select MIN(DayDate) from #tmp

drop table #tmp
go
drop table tmp_calendar
go
...
Рейтинг: 0 / 0
банковские дни
    #32074228
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без динамических запросов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create table #c( DayDate datetime, DayHour int, DayType int)
go
insert into #c values( '20011229', 0 , 1 )
insert into #c values( '20011230', 0 , 1 )
insert into #c values( '20011231', 0 , 1 )
insert into #c values( '20020101', 0 , 0 )
insert into #c values( '20020102', 0 , 1 )
insert into #c values( '20020103', 0 , 1 )
insert into #c values( '20020104', 0 , 1 )
 --insert into #c values( %af_src_str_7,0,1)
 
insert into #c values( '20020106', 0 , 1 )
insert into #c values( '20020107', 0 , 1 )
insert into #c values( '20020108', 0 , 1 )


declare @CurrentDate datetime, @CountDay int, @s nvarchar( 255 )

select @CurrentDate='20020108', @CountDay= 3 


select c1.DayDate, sum(case when  c2.DayType= 1  then  1  else  0  end) 
from #c c1, #c c2
where c2.DayDate>c1.DayDate and c2.DayDate<=@CurrentDate and c1.DayDate<=@CurrentDate 
group by c1.DayDate
having sum(case when  c2.DayType= 1  then  1  else  0  end)=@CountDay


Но это тоже неправильно. В смысле правильно, но надо не так подходить к задаче.
У Вас все равно ведётся таблица всех дней. Выберите какой-нибудь день за нулевой, а для всех остальных дней просчитайте количество рабочий дней между нулевым днём и текущим(назовём Дельтой). Тогда чтобы подсчитать разницу между днями или отойти на какое-нибудь количество дней в любую сторону Вам будет достаточно только вычесть Дельту между соответсвующими днями или найти день с нужной Дельтой.
...
Рейтинг: 0 / 0
банковские дни
    #32074230
Фотография KIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergSuper
Да, так элегантней и, конечно, лучше вычислять дельту.
Но, я не задавался целью менять структуру таблицы, это отдельный разговор.
Я пытался обойтись тем, что есть. :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / банковские дни
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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