将两个时间段合并为一个时间段

时间:2012-01-11 08:57:44

标签: c# .net oracle10g

我正在使用一个用.NET和Oracle构建的HR系统,我们在其中存储:

  • 带有开始/停止的一个表中的就业历史,例如组织,工作百分比,成本单位等
  • 另一个包含start / stopdate的表中的工资信息,例如月薪,小时工资

每次在此表中更改任何属性时,我们都会创建一个新行并设置上一期间的停止日期。

通常,当我们想向用户展示if时,我们只会从两个表中提供一小部分属性 - 例如组织和月薪来查看员工薪水的历史发展,这就是它开始的地方很难。

如果我们只加入表格,我们会为每次更改获得一行,如果组织/月份工资没有变化但是在其他属性中,则会向用户显示一个丑陋的混乱列表 - “为什么会有两行“是我们支持的一个非常相关的问题。 “亲爱的用户 - 这是因为我们将数据存储到表中”并不是一个好的答案;)

Data:

startdate   stopdate      organization jobpercent monthsalary
2011-01-01  2011-01-15    Sales        50         25000 
2011-01-16  2011-06-01    Sales        100        25000         
2011-06-02                Development  100        35000
Result when querying only for start/stop/organization monthsalary with no date merge

startdate   stopdate      organization monthsalary
2011-01-01  2011-01-15    Sales        25000 
2011-01-16  2011-06-01    Sales        25000         
2011-06-02                Development  35000

问题是我们必须合并所选属性相等的时间段 - 可以更改from / to-date,因为可以更改未选择的其他属性。

This is the result I want when querying only for start/stop/organization monthsalary. The first two rows are merged into one

startdate   stopdate      organization monthsalary
2011-01-01  2011-06-01    Sales        25000         
2011-06-02                Development  35000

我们已经通过一个性能很差的非常复杂的sql语句解决了这个问题。

有没有人解决过类似的用例?或者有一个方法的建议?

非常感谢任何帮助!!

祝你好运 /安德斯

2 个答案:

答案 0 :(得分:0)

我在我的HR应用程序上做了类似的事情,我的工作是:

select distinct salary, xxx fields and then group by for all the fields

但也许只有不同的薪水才足够。我必须说我正在谈论SQL服务器,我不知道甲骨文,但我猜“明显”也是。 ; - )

答案 1 :(得分:0)

organizationmonthsalary分组,因为这些不会改变。然后,您可以通过采用最小startdate和最大stopdate来合并期间。这假设期间之间没有空格:

with USRDAT as
       (select to_date('01/Jan/2011') as STARTDATE, to_date('15/Jan/2011') as STOPDATE, 'Sales' as ORGANIZATION, 25000 as MONTHSALARY from dual
        union all
        select to_date('16/Jan/2011'), to_date('01/Jun/2011'), 'Sales', 25000 from dual
        union all
        select to_date('02/Jun/2011'), null, 'Development', 35000 from dual)
  select min(STARTDATE) as STARTDATE, max(STOPDATE) as STOPDATE, ORGANIZATION, MONTHSALARY
    from USRDAT
group by ORGANIZATION, MONTHSALARY