Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И в чем проблема ? Вы не знаете, как написать цикл на (2090-2015)*365 итераций ? |
||
17 янв 14, 14:16 [15430155] Ответить | Цитировать Сообщить модератору |
Nikita Gavrilov Member Откуда: Сообщений: 56 |
может и знаю, но никак не могу вспомнить |
17 янв 14, 14:25 [15430240] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Я вам напомню http://technet.microsoft.com/ru-ru/library/ms178642.aspx |
||
17 янв 14, 14:26 [15430251] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Никто не знает про DayTypeID IN(20,21,22,23) по окончании 2014 года. Даже депутаты думы и члены правительства. Как им шлея под хвост попадёт, так и будет. Если речь идёт о РФ, разумеется. Так что не получится заполнить до 2090 года. |
17 янв 14, 15:28 [15430780] Ответить | Цитировать Сообщить модератору |
Calendar
Guest |
ну пристрелочный-то календарь заполнить можно, с трудными моментами в ручном порядке можно будет разобраться. PS 2090 - это ТС конечно оптимист. |
||
17 янв 14, 15:36 [15430857] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Server: Msg 170, Level 15, State 1, Line 5 Line 5: Incorrect syntax near ')'. |
||
17 янв 14, 16:16 [15431139] Ответить | Цитировать Сообщить модератору |
Nikita Gavrilov Member Откуда: Сообщений: 56 |
запитая не самое главное |
||||
17 янв 14, 16:25 [15431187] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Главное одобрение форума ? Чтобы можно было потом оправдаться - ну мне так сказали сделать ? |
||
17 янв 14, 16:28 [15431202] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А что по-вашему должно происходить при попытке прибавить число 1 к символьной строке '20160101' ? |
||
17 янв 14, 17:29 [15431560] Ответить | Цитировать Сообщить модератору |
Nikita Gavrilov Member Откуда: Сообщений: 56 |
что происходит я не знаю а хочу я что б мая переменая перешла на следующий день next_day sql не берет |
||||
17 янв 14, 17:31 [15431567] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы в школе математику учили ? А типы данных в программировании изучали ? |
||
17 янв 14, 17:33 [15431572] Ответить | Цитировать Сообщить модератору |
Nikita Gavrilov Member Откуда: Сообщений: 56 |
как мне дать понять программе чтоб он перешел на следующий день |
17 янв 14, 17:37 [15431584] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Цифры складывают с цифрами, строки - со строками. А типы преобразуют друг в друга документированными(а не придуманными) функциями |
||
17 янв 14, 17:39 [15431589] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну вообще-то к дате он прибавляет, не к строке: 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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну а тс-а то "переменная не переходит" |
||
17 янв 14, 17:46 [15431608] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну это уже к экстрасенсам ![]() у меня сей скрипт отрабатывает примерно как и было задумано: 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] Ответить | Цитировать Сообщить модератору |
Nikita Gavrilov Member Откуда: Сообщений: 56 |
большое спасибо!!!!! |
||||
17 янв 14, 17:56 [15431631] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Достаточно почитать предыдущую тему тс-а, чтобы понять, что он пишет код в соответствии со своими фантазиями, а не с логикой |
||
17 янв 14, 17:57 [15431635] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
Nikita Gavrilov, а, простите, за что? ![]() скрипт-то рабочий, а вот почему у Вас "оно не переходило" -- так и осталось тайной ... или
??? |
||
17 янв 14, 18:01 [15431650] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |