Мой вопрос идет дальше, чем вопрос в посте ниже: Как получить текущую дату вступления в силу в Oracle?
У меня есть несколько таблиц, подобных примеру в сообщении:
TID TName EffectiveDate
1 A 2011-7-1
2 A 2011-8-1
3 A 2011-9-1
4 A 2011-10-1
5 B 2011-8-1
6 B 2011-9-1
7 B 2011-10-1
8 C 2011-9-1
etc...
Если сегодня 2011-9-10, я бы хотел, чтобы результат запроса был таким:
TID TName EffectiveDate Status
1 A 2011-7-1 Invalid
2 A 2011-8-1 Invalid
3 A 2011-9-1 Valid
4 A 2011-10-1 Inactive
5 B 2011-8-1 Invalid
6 B 2011-9-1 Valid
7 B 2011-10-1 Inactive
8 C 2011-9-1 Valid
В приведенном выше вопросе было решение, подобное этому:
select TID,
TName,
EffectiveDate,
decode(sign(EffectiveDate - (select max(T2.EffectiveDate)
from MyTable T2
where T1.Tname=T2.Tname and
T2.EffectiveDate <= sysdate)),
-1,'Invalid',
0,'Valid',
'Inactive') Status
from MyTable T1
и работает нормально.
Я хотел создать функцию , которую можно вызывать с заданной таблицей в качестве параметра и которая возвращает вам статус (действительный, недействительный или неактивный) с системной датой в качестве значения даты по умолчанию.
Я не думаю, что это сложно.
Моя проблема в том, что иногда в таблице содержится больше столбцов, которые необходимо использовать для определения даты вступления в силу.
В приведенном выше примере вам нужно только взглянуть на TName, чтобы получить текущую дату вступления в силу.
В приведенном ниже примере вы должны взять emplid и empl_rcd вместе
TID EMPLID EMPL_RCD EFFECTIVEDATE
1 001 0 2011-07-01
2 001 0 2011-06-25
3 001 1 2011-07-01
4 002 0 2011-07-01
5 002 0 2011-08-01
Если сегодня 2012-01-01, результат должен быть:
TID EMPLID EMPL_RCD EFFECTIVEDATE STATUS
1 001 0 2011-07-01 valid
2 001 0 2011-06-25 invalid
3 001 1 2011-07-01 valid
4 002 0 2011-07-01 invalid
5 002 0 2011-08-01 valid
Во втором примере мой запрос должен выглядеть так:
select TID,
TName,
EffectiveDate,
decode(sign(EffectiveDate - (select max(T2.EffectiveDate)
from MyTable T2
where **T1.emplid=T2.emplid and
T1.empl_rcd = T2.empl_rcd and**
T2.EffectiveDate <= sysdate)),
-1,'Invalid',
0,'Valid',
'Inactive') Status
from MyTable T1
Но я хочу функцию, которую вы можете вызвать, например,
select T1.*,effdt_status(mytable) as status from mytable
, которая возвращает мне статус этой строки.Но, как упомянуто в двух разных примерах, иногда для определения действительной даты нужно сгруппировать больше столбцов.
Может кто-нибудь помочь мне написать эту функцию?