1

我有以下oracle数据库表USERS

在此处输入图像描述

我必须显示每个状态的用户状态开始日期和时间以及结束日期和时间。

从上面的例子中,我需要显示 STEVE BALE is LOGGED_OUT from 01/08/2013 12:00:00 AM to 01/08/2013 5:04:24.736437 AM

并且从 01/08/2013 5:04:24.736437 AM 到 01/08/2013 6:04:24.736437 AM 不可用,

并且从 01/08/2013 6:04:24.736437 AM 到 01/08/2013 7:31:08.591801 AM...

同样对于给定日期的最后记录新状态,用户 STEVE BALE 从 01/08/2013 11:30:50.724405 AM 到 01/08/2013 11:59:59 PM 为 LOGGED_OUT。

感谢您的时间。

4

2 回答 2

3

这其实很简单,因为 oracle 有这个lead()功能。就像是:

select t.*,
       lead(status_change_date) over (partition by user_name order by status_change_date) as end_status_time
from t

对于字符串,您可以执行以下操作:

select (t.user_name||' is '||t.new_status||' from '||
        to_char(status_change_date, 'mm/dd/yyyy hh:mi')+' to '||
        to_char(lead(status_change_date) over (partition by user_name order by status_change_date),
                'mm/dd/yyyy hh:mi')
       ) as thestring
from t 
于 2013-01-09T17:04:41.980 回答
0

如果我理解正确,这里有一些例子。在“到”部分使用您的日期/时间列:

Select 'STEVE BALE is LOGGED_OUT from: '||to_char(trunc(Sysdate), 'mm/dd/yyyy hh:mi:ss AM')||' to '||to_char((trunc(sysdate)+5/24)+04/1440, 'mm/dd/yyyy hh:mi:ss AM') "in_out"
From dual;

SQL> STEVE BALE is LOGGED_OUT from: 01/09/2013 12:00:00 AM to 01/09/2013 05:04:00 AM

要从上一行/下一行获取值,请按照 Gordon 的建议使用 Lag/Lead。

于 2013-01-09T18:32:54.447 回答