Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2? (http://forum.oszone.net/showthread.php?t=256565)

elec 18-03-2013 13:48 2113581

Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?
 
Добрый день уважаемые форумчане.
Прошу вас помочь в решении следующей задачи.


T1 - Таблица общего стажа по сотрудникам
Таб№ Начало Окончание
0001 01.01.2012 31.12.2012
0002 01.02.2012 25.12.2012
…… ………. ………..
000N 01.01.2012 31.12.2012



T2 - Таблица больничных листов сотрудников из Т1
Таб№ Начало Окончание
0001 15.01.2012 25.01.2012
0001 10.05.2012 15.05.2012
0002 01.02.2012 15.02.2012
…… ………… …………..
000N 03.10.2012 15.10.2012


Как из этих двух таблиц сделать третью, в котором стаж работы из Т1 разбит с учетом больничных листов из Т2.
Т.е. должно получиться сдедующее:
Таб№ Начало Окончание
0001 01.01.2012 14.01.2012
0001 15.01.2012 25.01.2012
0001 26.01.2012 09.05.2012
0001 10.05.2012 15.05.2012
0001 16.05.2012 31.12.2012
0002 01.02.2012 31.01.2012
0002 01.02.2012 15.02.2012
0002 16.02.2012 25.12.2012
….. ……. ……..
000N 01.01.2012 02.10.2012
000N 03.10.2012 15.10.2012
000N 16.10.2012 31/12.2012



Платформа MS SQL 2000.
Заранее благодарю за любую помощь в обсуждении.

lxa85 18-03-2013 16:57 2113693

elec, сделай доброе дело -- выдели одну из таблиц (например вторую) жирным шрифтом в совокупности таблиц. Вам, как автору видно разницу, мне, как человеку "с луны" ваще ее не видно! Где она?
И еще, приведи пожалуйста сценарии создания таблиц и, если получится, тестовый набор данных.

Delirium 18-03-2013 17:01 2113697

Цитата:

Цитата elec
Платформа MS SQL 2000 »

Серьезно? Оно еще живо?


Я тоже ничего не понял. Оформляй списки тегами, выделяем что нужно и половина вопроса сама решится, вот увидишь. Задача, судя по всему, тривиальная, но вот вопрос поставлен жутко криво.

elec 18-03-2013 18:38 2113774

set dateformat dmy
create table #t1 (id varchar(10), StDate datetime, EnDate datetime)
insert #t1 ((id, StDate , EnDate) select '0001', '01.01.2012', '31.12.2012'
insert #t1 ((id, StDate , EnDate) select '0002', '01.02.2012', '25.12.2012'
insert #t1 ((id, StDate , EnDate) select '0003', '01.01.2012', '31.12.2012'
insert #t1 ((id, StDate , EnDate) select '000N', '01.01.2012', '31.12.2012'

create table #t2 (id varchar(10), StDate datetime, EnDate datetime)
insert #t2 ((id, StDate , EnDate) select '0001', '15.01.2012', '25.01.2012'
insert #t2 ((id, StDate , EnDate) select '0001', '10.05.2012', '15.05.2012'
insert #t2 ((id, StDate , EnDate) select '0002', '01.02.2012', '15.02.2012'
insert #t2 ((id, StDate , EnDate) select '000N', '03.10.2012', '15.10.2012'

T1 - Таблица общего стажа по сотрудникам
Таб№ Начало Окончание
0001 01.01.2012 31.12.2012 сотрудник 1
0002 01.02.2012 25.12.2012 сотрудник 2
............................................................................................
000N 01.01.2012 31.12.2012 сотрудник N

-----------------------------------------------------------------------------------------------------------------------------

T2 - Таблица больничных листов сотрудников из Т1
Таб№ Начало Окончание
0001 15.01.2012 25.01.2012 сотрудник 1 болел с 15.01.2012 по 25.01.2012
0001 10.05.2012 15.05.2012 сотрудник 1 болел с 10.05.2012 по 15.05.2012
0002 01.02.2012 15.02.2012 и т.д.
...........................................................................
000N 03.10.2012 15.10.2012

--------------------------------------------------------------------------------------------------------------------
Т.е. должно получиться сдедующее:

Таб№ Начало Окончание
0001 01.01.2012 14.01.2012 сотрудник 1 работал с 01.01.2012 по 14.01.2012
0001 15.01.2012 25.01.2012 сотрудник 1 болел с 15.01.2012 по 25.01.2012
0001 26.01.2012 09.05.2012 сотрудник 1 работал с 26.01.2012 по 09.05.2012
0001 10.05.2012 15.05.2012 сотрудник 1 болел с 10.05.2012 по 15.05.2012
0001 16.05.2012 31.12.2012 сотрудник 1 работал с 16.05.2012 по 31.12.2012
0002 01.02.2012 31.01.2012 и т.д.
0002 01.02.2012 15.02.2012
0002 16.02.2012 25.12.2012
..........................................................
000N 01.01.2012 02.10.2012 сотрудник 1 работал с 01.01.2012 по 02.10.2012
000N 03.10.2012 15.10.2012 сотрудник 1 болел с 03.10.2012 по 15.10.2012
000N 16.10.2012 31.12.2012 сотрудник 1 работал 16.10.2012 по 31/12.2012


Вот такая задача. Сейчас понятно?

lxa85 18-03-2013 20:36 2113878

elec, да откуда берется столько значений?!
Из приведенного примера.
Входные данные:

001 -- 3 шт.
002 -- 2 шт.
003 -- 1 шт.
00N -- 2 шт.

А получаем

1 - 5
2 - 3
N - 3 !

Это что за метаморфоза?
Даты вообще плодятся в страшном кол-ве. От них в глазах рябит. Попросил же, выделить жирным тегом [b] [/b]
Код для 2008R2 сервера

PHP код:

DROP TABLE [oszone].[dbo].[t1];
set dateformat dmy;
create table t1 (id varchar(10), StDate datetimeEnDate datetime);
INSERT INTO T1 
VALUES 
('0001''01.01.2012''31.12.2012'),
(
'0002''01.02.2012''25.12.2012'),
(
'0003''01.01.2012''31.12.2012'),
(
'000N''01.01.2012''31.12.2012');


DROP TABLE [oszone].[dbo].[t2];
set dateformat dmy;
create table T2 (id varchar(10), StDate datetimeEnDate datetime);
INSERT INTO T2
VALUES 
('0001''15.01.2012''25.01.2012'),
(
'0001''10.05.2012''15.05.2012'),
(
'0002''01.02.2012''15.02.2012'),
(
'000N''03.10.2012''15.10.2012');


SELECT [id]
      ,[
StDate]
      ,[
EnDate]
  
FROM [oszone].[dbo].[t1]
;  
SELECT [id]
      ,[
StDate]
      ,[
EnDate]
  
FROM [oszone].[dbo].[t2]
;  
SELECT 
       
[oszone].[dbo].[t1].[id]
      ,[
oszone].[dbo].[t1].[StDate]
      ,[
oszone].[dbo].[t1].[EnDate]
  
FROM [oszone].[dbo].[t1]
UNION
SELECT      
      
[oszone].[dbo].[t2].[id]
      ,[
oszone].[dbo].[t2].[StDate]
      ,[
oszone].[dbo].[t2].[EnDate]
  
FROM [oszone].[dbo].[t2]
ORDER BY 
    
[oszone].[dbo].[t1].[id],
    [
oszone].[dbo].[t1].[StDate]



Обратить внимание на ключевое слово UNION и порядок сортировки ORDER BY.

elec 18-03-2013 21:24 2113906

Добрый день. Я может быть что-то некорректно написал.
В конторе ZZZ в 2012 году работали N кол-во человек (сотрудников). В таблице t1 записаны данные:
сотрудник - дата поступления и дата увольнения. Поэтому в таблице N количество записей.

Таб№ Начало Окончание
0001 01.01.2012 31.12.2012
0002 01.02.2012 25.12.2012
............................................................................................
000N 01.01.2012 31.12.2012

Сотрудник 0001 в конторе ZZZ проработал с 01.01.2012 по 31.12.2012, сотрудник 0002 с 01.02.2012 по 25.12.2012 и т.д.


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

0001 15.01.2012 25.01.2012
0001 10.05.2012 15.05.2012
0002 01.02.2012 15.02.2012
...........................................................................
000N 03.10.2012 15.10.2012



Т.е. сотрудник 0001 во время работы в конторе ZZZ хворал 2 раза с 15.01.2012 по 25.01.2012 и с 10.05.2012 по 15.05.2012. А сотрудник 0002 с 01.02.2012 по 15.02.2012, и т.д. Может быть кто-то вообще не болел.
Необходимо получить общую таблицу, в которой внутрь первой таблицы ставить периоды из второй таблицы.
Заранее неизвестно сколько будет у каждого сотрудника записей. Вот такая задача.


Время: 19:43.

Время: 19:43.
© OSzone.net 2001-