Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
есть таблица в slq calendar (CalendarID,CalendarDate,DayTypeID,Hours) заполнен до 31.12.2015 года
нужно написать скрипт что дозаполнить эту таблицу дальше до 2090 года

CalendarID,CalendarDate, DayTypeID, Hours
361 2015-12-27 00:00:00.000 21 8.000
362 2015-12-28 00:00:00.000 20 8.000
363 2015-12-29 00:00:00.000 20 8.000
364 2015-12-30 00:00:00.000 20 8.000
365 2015-12-31 00:00:00.000 23 7.000

DayTypeID
20 рабочие
21 выходной
22 праздник
23 предпраздничный Hours=7.000
17 янв 14, 14:14    [15430142]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
нужно написать скрипт что дозаполнить эту таблицу дальше до 2090 года

И в чем проблема ?
Вы не знаете, как написать цикл на (2090-2015)*365 итераций ?
17 янв 14, 14:16    [15430155]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
может и знаю, но никак не могу вспомнить
17 янв 14, 14:25    [15430240]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
может и знаю, но никак не могу вспомнить

Я вам напомню
http://technet.microsoft.com/ru-ru/library/ms178642.aspx
17 янв 14, 14:26    [15430251]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Никто не знает про DayTypeID IN(20,21,22,23) по окончании 2014 года.
Даже депутаты думы и члены правительства.
Как им шлея под хвост попадёт, так и будет.
Если речь идёт о РФ, разумеется.

Так что не получится заполнить до 2090 года.
17 янв 14, 15:28    [15430780]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Calendar
Guest
iap
Никто не знает про DayTypeID IN(20,21,22,23) по окончании 2014 года.
Даже депутаты думы и члены правительства.
Как им шлея под хвост попадёт, так и будет.
Если речь идёт о РФ, разумеется.

Так что не получится заполнить до 2090 года.

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

PS
2090 - это ТС конечно оптимист.
17 янв 14, 15:36    [15430857]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
o-o
Guest
оптимистический календарь для празднующих исключительно НГ и 1-ое мая
declare @fest table (dt int);
insert into @fest (dt)
values (0101), (0102), (0501);

declare @pre_fest table (dt int);
insert into @pre_fest (dt)
values (1231), (0430);


;with nums as
(
select v1.n*8*8*8*8 + v2.n*8*8*8 + v3.n*8*8 + v4.n*8 + v5.n as n
from (values (0),(1),(2),(3),(4),(5),(6),(7))v1(n),
     (values (0),(1),(2),(3),(4),(5),(6),(7))v2(n),
     (values (0),(1),(2),(3),(4),(5),(6),(7))v3(n),
     (values (0),(1),(2),(3),(4),(5),(6),(7))v4(n),
     (values (0),(1),(2),(3),(4),(5),(6),(7))v5(n)
where v1.n*8*8*8*8 + v2.n*8*8*8 + v3.n*8*8 + v4.n*8 + v5.n <= DATEDIFF(DAY, '20160101', '20901231')
)

select 365 + n as CalendarID,
       DATEADD(DAY, n, '20160101') CalendarDate,
       
       case
          when f.dt is not null then 22
          when p.dt is not null then 23
          when DATEPART(DW, DATEADD(DAY, n, '20160101')) in (1, 7) then 21
          else 20
       end as DayTypeID,
       
       case
          when f.dt is not null then 0
          when p.dt is not null then 7
          when DATEPART(DW, DATEADD(DAY, n, '20160101')) in (1, 7) then 0
          else 8
       end as Hours
       
from nums n left join @fest f
        on month(DATEADD(DAY, n.n, '20160101')) * 100 + day(DATEADD(DAY, n.n, '20160101')) = f.dt
            left join @pre_fest p
        on month(DATEADD(DAY, n.n, '20160101')) * 100 + day(DATEADD(DAY, n.n, '20160101')) = p.dt
order by 1  
17 янв 14, 16:03    [15431046]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
declare @i datetime
set @i='20160101'
while @i<='20901231'
begin
INSERT INTO [Calendar]([CalendarDate],[DayTypeID],[Hours],)
select @i,4,20,8.000
set @i=@i+1
end

вот так правильно или нет
17 янв 14, 16:13    [15431114]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
вот так правильно или нет

Server: Msg 170, Level 15, State 1, Line 5
Line 5: Incorrect syntax near ')'.
17 янв 14, 16:16    [15431139]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
Glory
Nikita Gavrilov
вот так правильно или нет

Server: Msg 170, Level 15, State 1, Line 5
Line 5: Incorrect syntax near ')'.


запитая не самое главное
17 янв 14, 16:25    [15431187]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
запитая не самое главное

Главное одобрение форума ? Чтобы можно было потом оправдаться - ну мне так сказали сделать ?
17 янв 14, 16:28    [15431202]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
declare @i datetime
set @i='20160101'
while @i<='20901231'
begin
INSERT INTO [Calendar]([CalendarDate],[DayTypeID],[Hours])
select @i,20,8.000
set @i=@i+1
end
не хочет работать @i не переходит на следующий день
17 янв 14, 17:26    [15431553]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
не хочет работать @i не переходит на следующий день

А что по-вашему должно происходить при попытке прибавить число 1 к символьной строке '20160101' ?
17 янв 14, 17:29    [15431560]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
Glory
Nikita Gavrilov
не хочет работать @i не переходит на следующий день

А что по-вашему должно происходить при попытке прибавить число 1 к символьной строке '20160101' ?

что происходит я не знаю
а хочу я что б мая переменая перешла на следующий день
next_day sql не берет
17 янв 14, 17:31    [15431567]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
что происходит я не знаю

Вы в школе математику учили ?
А типы данных в программировании изучали ?
17 янв 14, 17:33    [15431572]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
как мне дать понять программе чтоб он перешел на следующий день
17 янв 14, 17:37    [15431584]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nikita Gavrilov
как мне дать понять программе чтоб он перешел на следующий день

Цифры складывают с цифрами, строки - со строками.
А типы преобразуют друг в друга документированными(а не придуманными) функциями
17 янв 14, 17:39    [15431589]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
o-o
Guest
Glory
Nikita Gavrilov
не хочет работать @i не переходит на следующий день

А что по-вашему должно происходить при попытке прибавить число 1 к символьной строке '20160101' ?


ну вообще-то к дате он прибавляет, не к строке:
declare @i datetime


и вообще-то прибавляется:
declare @i datetime
set @i='20160101'
while @i<='20160110'
begin
print @i
set @i=@i+1
end
-------------------
Jan  1 2016 12:00AM
Jan  2 2016 12:00AM
Jan  3 2016 12:00AM
Jan  4 2016 12:00AM
Jan  5 2016 12:00AM
Jan  6 2016 12:00AM
Jan  7 2016 12:00AM
Jan  8 2016 12:00AM
Jan  9 2016 12:00AM
Jan 10 2016 12:00AM


хотя это и не документировано, да
17 янв 14, 17:43    [15431602]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
и вообще-то прибавляется:

Ну а тс-а то "переменная не переходит"
17 янв 14, 17:46    [15431608]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
o-o
Guest
Glory
o-o
и вообще-то прибавляется:

Ну а тс-а то "переменная не переходит"

ну это уже к экстрасенсам
у меня сей скрипт отрабатывает примерно как и было задумано:
declare @Calendar table ([CalendarDate] datetime,[DayTypeID] int,[Hours] money)

declare @i datetime
set @i='20160101'
while @i<='20901231'
begin
INSERT INTO @Calendar([CalendarDate],[DayTypeID],[Hours])
select @i,20,8.000
set @i=@i+1
end

select COUNT(*) as cnt, 
       MIN(CalendarDate) as min_dt, 
       MAX(CalendarDate) as max_dt
from @Calendar
--------------------
cnt	min_dt	max_dt
27394	2016-01-01 00:00:00.000	2090-12-31 00:00:00.000
17 янв 14, 17:51    [15431620]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
o-o
Glory
пропущено...

А что по-вашему должно происходить при попытке прибавить число 1 к символьной строке '20160101' ?


ну вообще-то к дате он прибавляет, не к строке:
declare @i datetime


и вообще-то прибавляется:
declare @i datetime
set @i='20160101'
while @i<='20160110'
begin
print @i
set @i=@i+1
end
-------------------
Jan  1 2016 12:00AM
Jan  2 2016 12:00AM
Jan  3 2016 12:00AM
Jan  4 2016 12:00AM
Jan  5 2016 12:00AM
Jan  6 2016 12:00AM
Jan  7 2016 12:00AM
Jan  8 2016 12:00AM
Jan  9 2016 12:00AM
Jan 10 2016 12:00AM


хотя это и не документировано, да



большое спасибо!!!!!
17 янв 14, 17:56    [15431631]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
ну это уже к экстрасенсам

Достаточно почитать предыдущую тему тс-а, чтобы понять, что он пишет код в соответствии со своими фантазиями, а не с логикой
17 янв 14, 17:57    [15431635]     Ответить | Цитировать Сообщить модератору
 Re: создание календаря  [new]
o-o
Guest
Nikita Gavrilov,

а, простите, за что?
скрипт-то рабочий,
а вот почему у Вас "оно не переходило" -- так и осталось тайной

... или
Glory
Главное одобрение форума ?

???
17 янв 14, 18:01    [15431650]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить