powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL SERVER компановка таблиц
9 сообщений из 34, страница 2 из 2
MS SQL SERVER компановка таблиц
    #39964876
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята кто знает от 14 до 18 колонок производственного календаря что значат
https://prnt.sc/sqkkuk
https://prnt.sc/sqkl4a
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965012
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

Вам нужно распарсить строки и образовать из них даты.
Если у Вас один из новых серверов БД, то там есть фукнция
Код: sql
1.
STRING_SPLIT ( string , separator )



Если из старых, то можно распарсить так:

Код: sql
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
set nocount on

declare @month_id tinyint
declare @month char(2)
declare @datechar char(8)
declare @date date
declare @type tinyint
	/*
	выходной
	праздничный (помечен плюсиком)
	предпраздникчный (помечен звездочкой)
	*/

declare @year char(4)

declare @day varchar(20)

declare @jan varchar(255)
declare @feb varchar(255)
declare @mar varchar(255)
-- и т.д. до декабря

declare @input_str varchar(255)

-- Пример Вашей старой таблицы (с календарем в виде запятых)
declare @pc_old table (
		column1 varchar(4),	-- год
		column2 varchar(255),	-- январь
		column3 varchar(255),	-- февраль
		column4 varchar(255)	-- февраль
		--  и т.д. до column13
	)

-- Пример Вашей старой таблицы (с календарем в виде запятых)
insert into @pc_old
	values('2019', '1,2,3,4,5,6,7,8,12,13,19,20,26,27', '2,3,9,10,16,17,22*,23,24', '2,3,7*,8,9,10,16,17,23,24,30,31')
		 ,('2020', '1,2,3,4,5,6,7,8,11,12,18,19,25,26', '1,2,8,9,15,16,22,23,24+,29', '1,7,8,9+,14,15,21,22,28,29')

-- новая, правильная таблица производственного, сделайте ее в своей база с нужным наименованием
declare @pc_new table (
		date date,
		type tinyint
	)

declare @delimeter nvarchar(1) = ','
declare @delimeter1 nvarchar(1) = '+'
declare @delimeter2 nvarchar(1) = '*'
declare @pos int

declare yearline cursor for
	select column1, column2, column3, column4 from @pc_old

open yearline
fetch next from yearline into @year, @jan, @feb, @mar -- и т.д. до декабря


while @@fetch_status = 0 begin
	set @month_id = 1
	while @month_id <= 12 begin

		if @month_id = 1 set @input_str = @jan
		if @month_id = 2 set @input_str = @feb
		if @month_id = 3 set @input_str = @mar
		
		set @month = replicate( '0', 2 - len(cast(@month_id as char(2))) ) + cast(@month_id as char(2))
		set @pos = charindex(@delimeter, @input_str)    
		while (@pos != 0)
		begin
			set @day = substring(@input_str, 1, @pos-1)
			set @type = 0 -- выходной
			
			if charindex(@delimeter1,@day) > 0 begin			
					set @day = 	substring(@day, 1, len(@day)-1)
					set @type = 1 -- с плюсиком возле даты, праздничный
				end	
			if charindex(@delimeter2,@day) > 0 begin		
					set @day = 	substring(@day, 1, len(@day)-1)
					set @type = 2 -- со зведочкой возле даты, предпраздничный
				end			
			set @day = replicate( '0', 2 - len(@day) ) + @day
			set @date = cast(@year + @month + @day as date)

			print 'год : ' + cast(@year as varchar(50)) + '    /    дата : ' + cast(@date as varchar(50)) + '    /    тип : ' + cast(@type as varchar(2))
			-- в этом месте переменные @date и @type можете вставлять в любую таблицу с календарем, или делать update
			insert into @pc_new(date, type) values (@date, @type)

			set @input_str = substring(@input_str, @pos+1, len(@input_str))			
			set @pos = charindex(@delimeter,@input_str)
		end		
		set @month_id = @month_id + 1

	end
	fetch next from yearline into @year, @jan, @feb, @mar
end

close yearline;  
deallocate yearline;

select * from @pc_new

/*
дальше можете объединять таблицы
например, в таблице calendar добавить поле тип (выхходный, рабочий, праздничный, предпраздничный день)
и провести update испольуя полученную таблицу производственного календаря
*/



П.С. я создал таблицу @pc_old для примера. Вы же используйте уже залитые в БД данные.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965014
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

14-18
смотрите заголовки, это:

Всего рабочих дней
Всего праздничных и выходных дней
Количество рабочих часов при 40-часовой рабочей неделе
Количество рабочих часов при 36-часовой рабочей неделе
Количество рабочих часов при 24-часовой рабочей неделе
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965029
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
Ребята кто знает от 14 до 18 колонок производственного календаря что значат
https://prnt.sc/sqkkuk
https://prnt.sc/sqkl4a


Воспользуйтесь обычным календарем.
С флагом выходных.
Который (флаг) можно редактировать из приложения.
Все будет проще и яснее.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965143
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fox Malder,
Спасибо большое == работает
Но при выводе дат где то теряется последняя дата каждого месяца === попробую разобраться может у меня получится.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965338
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,На сколько я понял последнее число месяца теряется где то при формировании дат
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965740
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asdor,

если есть ссылка, кидайте, пригодится
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39965760
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,


Код: sql
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
set nocount on

declare @month_id tinyint
declare @month char(2)
declare @datechar char(8)
declare @date date
declare @type tinyint
	/*
	выходной
	праздничный (помечен плюсиком)
	предпраздникчный (помечен звездочкой)
	*/

declare @year char(4)

declare @day varchar(20)

declare @jan varchar(255)
declare @feb varchar(255)
declare @mar varchar(255)
-- и т.д. до декабря

declare @input_str varchar(255)

-- Пример Вашей старой таблицы (с календарем в виде запятых)
declare @pc_old table (
		column1 varchar(4),	-- год
		column2 varchar(255),	-- январь
		column3 varchar(255),	-- февраль
		column4 varchar(255)	-- февраль
		--  и т.д. до column13
	)

-- Пример Вашей старой таблицы (с календарем в виде запятых)
insert into @pc_old
	values('2019', '1,2,3,4,27', '2,22*,23,24', '2,3,7*,8,9')
		 

--	values('2019', '1,2,3,4,5,6,7,8,12,13,19,20,26,27', '2,3,9,10,16,17,22*,23,24', '2,3,7*,8,9,10,16,17,23,24,30,31')
		 --,('2020', '1,2,3,4,5,6,7,8,11,12,18,19,25,26', '1,2,8,9,15,16,22,23,24+,29', '1,7,8,9+,14,15,21,22,28,29')

-- новая, правильная таблица производственного, сделайте ее в своей база с нужным наименованием
declare @pc_new table (
		date date,
		type tinyint
	)

declare @delimeter nvarchar(1) = ','
declare @delimeter1 nvarchar(1) = '+'
declare @delimeter2 nvarchar(1) = '*'
declare @pos int

declare yearline cursor for
	select column1, column2, column3, column4 from @pc_old

open yearline
fetch next from yearline into @year, @jan, @feb, @mar -- и т.д. до декабря


while @@fetch_status = 0 begin
	set @month_id = 1
	while @month_id <= 12 begin
		set @input_str = ''
		if @month_id = 1 set @input_str = @jan
		if @month_id = 2 set @input_str = @feb
		if @month_id = 3 set @input_str = @mar
		
		set @month = replicate( '0', 2 - len(cast(@month_id as char(2))) ) + cast(@month_id as char(2))
		set @pos = charindex(@delimeter, @input_str)    
		while (@pos != 0)
			begin
				set @day = substring(@input_str, 1, @pos-1)
				set @type = 0 -- выходной
			
				if charindex(@delimeter1,@day) > 0 begin			
						set @day = 	substring(@day, 1, len(@day)-1)
						set @type = 1 -- с плюсиком возле даты, праздничный
					end	
				if charindex(@delimeter2,@day) > 0 begin		
						set @day = 	substring(@day, 1, len(@day)-1)
						set @type = 2 -- со зведочкой возле даты, предпраздничный
					end			
				set @day = replicate( '0', 2 - len(@day) ) + @day
				set @date = cast(@year + @month + @day as date)

				print 'год : ' + cast(@year as varchar(50)) + '    /    дата : ' + cast(@date as varchar(50)) + '    /    тип : ' + cast(@type as varchar(2))
				-- в этом месте переменные @date и @type можете вставлять в любую таблицу с календарем, или делать update
				insert into @pc_new(date, type) values (@date, @type)

				set @input_str = substring(@input_str, @pos+1, len(@input_str))			
				set @pos = charindex(@delimeter,@input_str)
			end

		if (@pos = 0 and len(@input_str) > 0)
			begin
				set @day = @input_str
				set @type = 0 -- выходной
			
				if charindex(@delimeter1,@day) > 0 begin			
						set @day = 	substring(@day, 1, len(@day)-1)
						set @type = 1 -- с плюсиком возле даты, праздничный
					end	
				if charindex(@delimeter2,@day) > 0 begin		
						set @day = 	substring(@day, 1, len(@day)-1)
						set @type = 2 -- со зведочкой возле даты, предпраздничный
					end			
				set @day = replicate( '0', 2 - len(@day) ) + @day
				set @date = cast(@year + @month + @day as date)

				print 'год : ' + cast(@year as varchar(50)) + '    /    дата : ' + cast(@date as varchar(50)) + '    /    тип : ' + cast(@type as varchar(2))
				-- в этом месте переменные @date и @type можете вставлять в любую таблицу с календарем, или делать update
				insert into @pc_new(date, type) values (@date, @type)

				set @input_str = substring(@input_str, @pos+1, len(@input_str))			
				set @pos = charindex(@delimeter,@input_str)
			end

		set @month_id = @month_id + 1

	end
	fetch next from yearline into @year, @jan, @feb, @mar
end

close yearline;  
deallocate yearline;

select * from @pc_new


...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39969987
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощ
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL SERVER компановка таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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