powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL SERVER компановка таблиц
34 сообщений из 34, показаны все 2 страниц
MS SQL SERVER компановка таблиц
    #39963262
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте

Есть такая схема
https://prnt.sc/sp9wfd

dbo.Bus там находятся автобусы == Икарус == Маршрутка
dbo.Driver Имена водителей
IntercityBus автобусы дальнего следования
TwoSectionBuses автобусы курсирующие в городе
Weekend Это таблица где написаны праздничные дни месяца нерабочие

Нарисовать схему БД и написать запрос на языке T-SQL, выводящий расписание для междугородных автобусов на выходные дни текущего месяца.

К чему привязать таблицу Weekend или вообще оставить без связи ?
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963271
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii,

ни одна из таблиц по смыслу не связана с таблицей Weekend.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963273
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, Именно не связанна
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963275
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,Получается оставить без связи и ссылаться на нее в запросах о входных днях
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963354
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему не объединить IntercityBus и TwoSectionBus в одну таблицу с полем-дискриминатором? На одном автобусе у тебя может ездить куча водителей, но разве не может один водитель ездить на разных автобусах? Смысл таблицы Bus какой вообще? Это какой-то конкретный автобус, или номер маршрута, или что? Мне кажется, что, просто, твоя схема, на самом деле, это говносхема :(
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963365
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii,

замените Weekend на Календарь
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963487
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,
Таблица Bus там одно поле в котором написаны марки автобусов например Икарус номер такой то == Маршрутка номер такая то ну точно так же как и Таблица Driver только в место автобусов там имена водителей . Вопрос почему я не соединил эти 2 таблицы.
У нас 3 разновидности направлений == Междугородные рейсы = пригородные и городские .
Если создавать все в 1 таблице это вполне можно но тогда нужно добавить поле чтобы их различать а именно междугородный это рейс или пригородный. Чтобы не дублировать кучу одинаковых полей я решил разбить это на 3 таблицы по рейсам.

https://prnt.sc/spgnam


UrbanBas - городские маршруты
IntercityBus - междугородные маршруты
ShuttleBus - пригородные маршруты


Спасибо всем за советы .
Исправил название таблицы + КАЛЕНДАРЬ + и поставил связи многие ко многим между таблицами Водителя и Автобусов но

Главный вопрос так и остался не выясненным что делать с таблицей календарь я думаю что ее так и оставить без связей.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963519
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопрос В таблице Calendar должны быть все выходные дни с субботами и воскресениями или туда заносятся только простые праздники ? Я о том когда буду писать запрос как определять выходные субботу и воскресение через таблицу календарь или через функцию ?
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963536
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii,

удобно сохранить в таблице и выходные, и праздничные дни.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963575
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
И еще вопрос В таблице Calendar должны быть все выходные дни с субботами и воскресениями или туда заносятся только простые праздники ? Я о том когда буду писать запрос как определять выходные субботу и воскресение через таблицу календарь или через функцию ?
В таблице Calendar должны быть все дни. А выходные дни, субботы, воскресенья, праздники, переносы выходных дней, определяемые постановления правительства, отмечаются атрибутами, например, IsWorker, IsHolyday, и т.д.
В интернете можно найти пример такой таблицы, с скриптом для её заполнения (потом, конечно, нужно вручную отметить праздники в соответствии с распоряжениями властей в конкретной стране).

Тогда всё будет быстро для сервера, и удобно для программиста, без зубодробительных условий в запросах.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963583
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,Не дадите ссылку на такой пример я искал но что то не нашел == наверно не правильно задавал запрос в браузере
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963617
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
alexeyvg,Не дадите ссылку на такой пример я искал но что то не нашел == наверно не правильно задавал запрос в браузере
Например, в порядке полезности:
http://blog.bitimpulse.com/post/2013/02/12/Date-and-Time-Dimension-Template.aspx
https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya
https://www.sql.ru/forum/1071602/sozdanie-kalendarya
https://www.sql.ru/forum/1203116/sproektirovat-kalendar-rabochih-dney
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963630
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, ОО !! Большое спасибо . Теперь есть чем заняться
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963636
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii

Главный вопрос так и остался не выясненным что делать с таблицей календарь я думаю что ее так и оставить без связей.


Весь вопрос, что вы будете делать с данными, которые есть в "календаре" :)
Если судить по представленной структуре баз, то он вам вообще не нужен.
А так.. Обычно Календарь имеет связи с теми полями других таблиц, где хранятся даты, в случае необходимости учета выходных/праздничных/нерабочих и т.д. дней
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963663
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
. Требуется автоматизировать процесс назначения автобусов автопарка на маршруты. В автопарке есть расписание по дням какой автобус на какой маршрут назначен. Определённые автобусы могут быть назначены только на определённые маршруты. Например, междугородные автобусы назначаются только на междугородные маршруты, двухсекционные автобусы на маршруты по большим улицам и т.п. Нарисовать схему БД и написать запрос на языке T-SQL, выводящий расписание для междугородных автобусов на выходные дни текущего месяца.

Вот у меня такое задание == хочется сделать красиво и правильно

Если структура та что у меня не подходит то изменить ее не поздно .
Главное понять свою ошибку .
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963838
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я хотел занести в таблицу == КАЛЕНДАРЬ == выходные все а потом через запрос сравнивая даты выходных дней из таблицы ++ КАЛЕНДАРЬ с датами рейсов у других таблиц выводить таким способом все рейсы в выходные дни или рейсы по направлениям.
Но посоветовавшись я понял что мой метод наверно будет работать не столь быстро так как есть какие то более прогрессивные методы
которые будут работать быстрее. Хотелось бы понять их алгоритм. И разобраться как это написать. .
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963855
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iivvvii
Определённые автобусы могут быть назначены только на определённые маршруты

это бизнеслогика, она к структуре имеет вторичное отношение. Вы можете заложить ограничения и правила в структуру связей таблиц, но это не основной механизм управления бизнеслогикой.

iivvvii
Требуется автоматизировать процесс
iivvvii
написать запрос на языке T-SQL, выводящий расписание

Выводящий или составляющий?
Выводящий в каком виде? Таблички или будет интерфейс?

Определите для себя как вы видите конечный результат. Это поможет.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39963926
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii
godsql,
. Требуется автоматизировать процесс назначения автобусов автопарка на маршруты. В автопарке есть расписание по дням какой автобус на какой маршрут назначен. Определённые автобусы могут быть назначены только на определённые маршруты. Например, междугородные автобусы назначаются только на междугородные маршруты, двухсекционные автобусы на маршруты по большим улицам и т.п. Нарисовать схему БД и написать запрос на языке T-SQL, выводящий расписание для междугородных автобусов на выходные дни текущего месяца.

Все равно непонятно. Городить какую-то структуру ради запроса "выводящий расписание для междугородных автобусов на выходные дни текущего месяца"?

В общем, рекомендую пробовать пройти стандартным путем разработки:
1. Определить задачи приложения
2. Определить работу бизинеслогики.
3. Разложить бизнеслогику на элементарные составляющие
4. Определить необходимое количество данных
5. Спроектировать таблицы и связи
ну и т.д.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964072
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii
Требуется автоматизировать процесс
iivvvii
написать запрос на языке T-SQL, выводящий расписание

Выводящий или составляющий?
Выводящий в каком виде? Таблички или будет интерфейс?

Определите для себя как вы видите конечный результат. Это поможет.[/quot]

Выводящий или составляющий = да какая разница лижбы понять как правильно это делать а кроме того подхода что я писал выше у меня нет других идей.

Думаю сделать в виде таблицы.

Конечный результат
По заданию вывести в запросе в табличном виде все рейсы междугородние на выходные дни .
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964074
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я программирую в основном на C# .NET = А сложные вопросы типа этого иногда меня ставят в тупик
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964205
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведите примеры данных, которые могут оказаться в Ваших таблицах, выложите скрины. Не все однозначно понятно по вашим атрибутам.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964229
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fox Malder,

https://prnt.sc/sq78vf
https://prnt.sc/sq798t
https://prnt.sc/sq79ky
https://prnt.sc/sq79xj
https://prnt.sc/sq7awb
https://prnt.sc/sq7bqr
https://prnt.sc/sq7cgw

Возможно лучше обьединить 3 таблицы вместе маршрутов с полем которое будит их идентифицировать

И вообще
Не пойму зачем в таблицу Календарь заносить все дни не достаточно ли там одних выходных дней дат ? Или я чего то не понимаю

https://prnt.sc/spgnam

По заданию нужно найти выходные:
Требуется автоматизировать процесс назначения автобусов автопарка на маршруты. В автопарке есть расписание по дням какой автобус на какой маршрут назначен. Определённые автобусы могут быть назначены только на определённые маршруты. Например, междугородные автобусы назначаются только на междугородные маршруты, двухсекционные автобусы на маршруты по большим улицам и т.п. Нарисовать схему БД и написать запрос на языке T-SQL, выводящий расписание для междугородных автобусов на выходные дни текущего месяца.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964242
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

1) Скорее всего имеется ввиду таблица не просто календаря, а производственного календаря. Официальную версию можно найти здесь : https://data.gov.ru/opendata/7708660670-proizvcalendar , скачать можно в формате csv, и после этого закачать себе в БД. Он седержит перечень выходных и праздничных дней.

2) Таблицы IntercityBus и остальные, это не Bus, это сущность маршрута. Значит их нужно свети в одну таблицу. Чтобы отделять один тип от другого добавьте колонку type, и сделайте для этой колонки таблицу - справочник тивов маршрута 1 - международный, 2 - междугородний, 3 - еще какой-то и т.д. Ведь иначе, если типы маршуртов буду расширятся, то с Вашей схемой устанете плодить таблички. А в приведенном варианте нужно добавить только одну строку с типом.

3) Связывать с календарем можно по полям Dute в таблице маршрута, и dat в поле календаря.

3а) Если в календарь закачаетее только данные из источника, значит у Вас там будут только выходные и праздничные. Занчит если даты dute и dat сопадают это нужная Вам выборка.

3б) Если в календаре будуе держать все дни, то, объединяя все дни, и данные из csv введите поле, которе будет флагом, указывающим какой это день рабочий или выходный.

Сделайте как поняли, покажите структуру и данные, и продожим. Если что-то непонятно, пишите, отвечу.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964250
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iivvvii,

Смотрите, у вас вырисовывается следующие сущности, имхо:

1. Водители
2. Маршруты (внутри/междугородний/.., время и т.д.)
3. Транспортные средства ( тип, размер и т.д.)
4. Календарь (в принципе, можно заносить только праздничные/выходные, если у вас только 2 вида назначений, но обычно просто делают полный календарь)
5. Работа (Выезд?) : связь Маршрут -> ТС + Водитель -> дата;время
6. Ограничения, опционально ( например, автобусов на маршрут)
7. Работа водителей, опционально ( можно вытаскивать из т.Выезд, но выгоднее вести отдельный учет)
8. Доступность ТС для назначения на маршрут, опционально (скажем: Дата;ИД ТС;Состояние)
9. Назначение Водителей на ТС, опц. (ИД Вод; ИД ТС; ДатаНачала;ДатаОконч)

Т.о. описанная задача будет сводится к :

Запросить ТС, где ТС соответствует типу Маршрута и доступны, Водители которых доступны, не работают (из Работы) и соответствуют ограничению на нужные Календарные даты.

При этом нужно учитывать, что ТС может быть больше актуальных Маршрутов (по типам), так и Маршрутов м.б. больше доступных соответствующих ТС.
...
Рейтинг: 0 / 0
MS SQL SERVER компановка таблиц
    #39964353
iivvvii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fox Malder,
https://prnt.sc/sqkf91 Схема
https://prnt.sc/sqkgkx RoutessType
https://prnt.sc/sqkhkr Routess
https://prnt.sc/sqkhyq Driver
https://prnt.sc/sqkjme Calendar
https://prnt.sc/sqkjbd BusDriver
https://prnt.sc/sqkixu Bus

Скачал файл производственного календаря закачал его в менеджмент студио mssql
https://prnt.sc/sqkkuk
https://prnt.sc/sqkl4a

Теперь осталось разобраться как с таблицей этой работать искал в интернете не нашел инструкций.
Как я понял мне нужно из этой таблицы скачать выходные дни и праздники в таблицу Calendar
Каким образом я не знаю так как то она слишком интересно сделана и непонятно что лежит в колонках с 14 по 18
В этой таблице в одной ячейке записаны даты всего месяца через запятую.

Хотел бы сделать и как по заданию и с сохренинием выходных дней
И с сохранением всех дней в таблицу . 2 вариата
Для практики.
...
Рейтинг: 0 / 0
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
34 сообщений из 34, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL SERVER компановка таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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