На прошлой неделе я столкнулся с переполнением стека, чтобы попытаться решить эту проблему, и я до сих пор не могу найти жизнеспособное решение, поэтому мне было интересно, может ли кто-нибудь предложить мне некоторую помощь/совет?
Объяснение структур данных
У меня есть следующие таблицы:
Таблица должностей (zz_position
), которая используется для хранения сведений о должности (идентификатор задания), включает диапазон дат, для которого она действительна.
PosNo Description Date_From Date_To
---------------------------------------------------------
10001 System Administrator 20170101 20231231
Таблица ресурсов (zz_resource
), которая используется для хранения сведений о ресурсе (сотруднике), включая дату, когда он присоединился к компании и покинул ее.
resID description date_from date_to
------------------------------------------
100 Sam 20160101 20991231
101 Joe 20150101 20991231
Таблица занятости (zz_employment
), которая используется для привязки должности к ресурсам в пределах даты от и до диапазона
PosNo resID Date_From Date_To seqNo
---------------------------------------------------
10001 100 20180101 20180401 1
10001 101 20180601 20191231 2
10001 100 20200101 20991231 3
Проблема
Теперь из-за того, что люди меняют должности, пост может быть не заполнен в течение определенного периода времени, и я пытаюсь создать отчет, который я могу использовать, чтобы дать мне разбивку статуса поста в любой момент времени.
Я знаю, что могу создать отчет, который полностью отображает каждый день с использованием таблицы календаря, однако мне нужен отчет, который создает данные в следующем агрегированном формате:
PosNo resID Date_From Date_To seqNo
-------------------------------------------------
10001 NULL 20170101 20171231 0
10001 100 20180101 20180401 1
10001 NULL 20180402 20180530 0
10001 101 20180601 20191231 2
10001 100 20200101 20231231 3
insert into zz_employment
values ('10001', '100', '2018-01-01 00:00:00.000', '2018-04-01 00:00:00.000', 1),
('10001', '101', '2018-06-01 00:00:00.000', '2019-12-31 00:00:00.000', 2),
('10001', '100', '2020-01-01 00:00:00.000', '2099-12-31 00:00:00.000', 3)
(обратите внимание, как отчет взял две строки в таблице и создал полностью указанный срок службы, где дата первой нулевой строки вытягивается из даты начала должности, а дата последней строки вытягивается из даты окончания должности .
В идеале я хотел бы это как представление/функцию, однако из-за сложности я был бы более чем счастлив иметь серию операторов T SQL, которые я могу запускать каждую ночь как часть процедуры хранилища данных.
Правила
- все даты усекаются до datetime, так что date_to ссылается на дату окончания, а не на дату и время окончания
- если у поста/работы/ресурса нет даты окончания, то он будет обозначаться как 20991231
- если сама занятость открыта, то дата в таблице занятости обозначается как 20991231, даже если сама должность может закончиться в 20231231. В идеале я хотел бы, чтобы результат соответствовал дате окончания должности.
SQL-код:
CREATE TABLE zz_position
(
posNo varchar(25) NOT NULL,
description varchar(25) NOT NULL,
date_from datetime NULL,
date_to datetime NULL
)
insert into zz_position
values ('10001', 'System Administrator', '2017-01-01 00:00:00.000', '2020-12-31 00:00:00.000')
go
CREATE TABLE zz_resource
(
resID varchar(25) NOT NULL,
description varchar(25) NOT NULL,
date_from datetime NULL,
date_to datetime NULL
)
insert into zz_resource
values ('100', 'Sam', '2016-01-01 00:00:00.000', '2099-12-31 00:00:00.000'),
('101', 'Joe', '2015-01-01 00:00:00.000', '2099-12-31 00:00:00.000')
go
CREATE TABLE zz_employment
(
posNo varchar(25) NOT NULL,
resID varchar(25) NOT NULL,
date_from datetime NULL,
date_to datetime NULL,
seqNo int NULL
)
insert into zz_employment
values ('10001', '100', '2018-01-01 00:00:00.000', '2018-04-01 00:00:00.000', 1),
('10001', '101', '2018-06-01 00:00:00.000', '2019-12-31 00:00:00.000', 2),
('10001', '100', '2020-01-01 00:00:00.000', '2099-12-31 00:00:00.000', 3)
yyyy-MM-dd( hh:mm:ss)
с типом данныхdatetime
; SQL Server интерпретирует его какyyyy-dd-MM( hh:mm:ss)
, что означает, что некоторые из этих значений не удастся вставить.yyyyMMdd
иyyyy-MM-ddThh:mm:ss
будут работать независимо от языка и типа данных. - person Larnu   schedule 19.02.2019