Oracle中同一列中的两个日期之间的差异

发布于 2024-09-15 08:59:02 字数 888 浏览 3 评论 0原文

我有一个表 MyTable ,其中包含 columns:

ID   number       (autoincrement)
STAT number(3)    (status: 1-start, 2-stop)
USER varchar2(15) (user name)
DATE date         (date)

和 data:

ID  STAT    USER    DATE
---------------------------------------
1   1   USER1   18.08.2010 13:10:14
2   2   USER1   18.08.2010 15:15:40
3   1   USER1   18.08.2010 16:15:10
4   2   USER1   18.08.2010 18:35:32
5   1   USER2   18.08.2010 07:05:46
6   2   USER2   18.08.2010 13:10:01
7   1   USER1   19.08.2010 09:01:10
8   2   USER1   19.08.2010 16:15:19
9   1   USER2   19.08.2010 11:02:56
10  2   USER2   19.08.2010 18:45:22

我如何得到这样的内容:

USER        DATE       DURATION
--------------------------------
USER1   18.8.2010   04:25:48
USER2   18.8.2010   06:04:15
USER1   19.8.2010   07:14:09
USER2   19.8.2010   07:42:26

I have a table MyTable with columns:

ID   number       (autoincrement)
STAT number(3)    (status: 1-start, 2-stop)
USER varchar2(15) (user name)
DATE date         (date)

with data:

ID  STAT    USER    DATE
---------------------------------------
1   1   USER1   18.08.2010 13:10:14
2   2   USER1   18.08.2010 15:15:40
3   1   USER1   18.08.2010 16:15:10
4   2   USER1   18.08.2010 18:35:32
5   1   USER2   18.08.2010 07:05:46
6   2   USER2   18.08.2010 13:10:01
7   1   USER1   19.08.2010 09:01:10
8   2   USER1   19.08.2010 16:15:19
9   1   USER2   19.08.2010 11:02:56
10  2   USER2   19.08.2010 18:45:22

How do I get something like this:

USER        DATE       DURATION
--------------------------------
USER1   18.8.2010   04:25:48
USER2   18.8.2010   06:04:15
USER1   19.8.2010   07:14:09
USER2   19.8.2010   07:42:26

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

傲影 2024-09-22 08:59:29
SELECT 
    USER,
    TO_CHAR(DATE, 'DD.MM.YYYY') DATE,
    TO_CHAR(DATE, 'HH24:MI:SS') DURATION
FROM MyTable 

试试这个。

SELECT 
    USER,
    TO_CHAR(DATE, 'DD.MM.YYYY') DATE,
    TO_CHAR(DATE, 'HH24:MI:SS') DURATION
FROM MyTable 

Try this.

不甘平庸 2024-09-22 08:59:25
/* CREATING TABLE */
create table T_USER_INCIDENT
(
ID number
,STAT number(1)
,USER_ID varchar2(15)
,INCIDENT_DATE date
)
/*================================*/

/* CREATING SEQENCE */
create sequence SQ_USER_INCIDENT
start with 1 
increment by 1 
nomaxvalue;
/*================================*/

/* CREATE TRIGGER FOR ID INSERT */
create trigger TRIG_USER_INCIDENT
before insert on T_USER_INCIDENT
for each row
begin
select SQ_USER_INCIDENT.nextval into :new.id from dual;
end;
/
/*================================*/

/* INSERTING GIVEN SAMPLE  DATA */
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER1',TO_DATE('18.08.2010 13:10:14','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER1',TO_DATE('18.08.2010 15:15:40','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER1',TO_DATE('18.08.2010 16:15:10','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER1',TO_DATE('18.08.2010 18:35:32','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER2',TO_DATE('18.08.2010 07:05:46','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER2',TO_DATE('18.08.2010 13:10:01','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER1',TO_DATE('19.08.2010 09:01:10','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER1',TO_DATE('19.08.2010 16:15:19','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER2',TO_DATE('19.08.2010 11:02:56','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER2',TO_DATE('19.08.2010 18:45:22','DD.MM.YYYY HH24:MI:SS'));
/*================================*/

/* CHECKING INSERTED DATA */
SELECT * FROM T_USER_INCIDENT

/*===================================================*/
/*               OUT PUT OF ABOVE QUERY              */
/*===================================================*/
/* 1    1   1   USER1   8/18/2010 1:10:14 PM */
/* 2    2   2   USER1   8/18/2010 3:15:40 PM */
/* 3    3   1   USER1   8/18/2010 4:15:10 PM */
/* 4    4   2   USER1   8/18/2010 6:35:32 PM */
/* 5    5   1   USER2   8/18/2010 7:05:46 AM */
/* 6    6   2   USER2   8/18/2010 1:10:01 PM */
/* 7    7   1   USER1   8/19/2010 9:01:10 AM */
/* 8    8   2   USER1   8/19/2010 4:15:19 PM */
/* 9    9   1   USER2   8/19/201011:02:56 AM */
/* 10   10  2   USER2   8/19/2010 6:45:22 PM */
/*===================================================*/

/*CREATING FUNCTION TO RETURN RESPECTED CLOSING TIME OF INCIDENT WITH GIVEN USER_ID */
CREATE OR REPLACE FUNCTION FN_GET_INCIDENT_END_TIME
(P_USER_ID IN T_USER_INCIDENT.USER_ID%TYPE,
 P_INCIDENT_START_TIME T_USER_INCIDENT.INCIDENT_DATE%TYPE)
RETURN T_USER_INCIDENT.INCIDENT_DATE%TYPE
IS
  V_INCIDENT_CLOSE_TIME T_USER_INCIDENT.INCIDENT_DATE%TYPE;
BEGIN
     SELECT MIN(CLOSE_TIMES)
     INTO V_INCIDENT_CLOSE_TIME
     FROM
     (SELECT A.INCIDENT_DATE AS CLOSE_TIMES
      FROM T_USER_INCIDENT A
      WHERE A.USER_ID=P_USER_ID AND A.INCIDENT_DATE>P_INCIDENT_START_TIME AND A.STAT=2);
      RETURN V_INCIDENT_CLOSE_TIME;
END FN_GET_INCIDENT_END_TIME;
/*================================*/

/* MAIN QUERY FOR OUT PUT */
SELECT USER_ID as "USER",TRUNC(INCIDENT_DATE) as "DATE",to_char(to_date('00:00:00','HH24:MI:SS') + SUM(DURATION), 'HH24:MI:SS') as "DURATION"
FROM
(SELECT
UI.USER_ID
,UI.INCIDENT_DATE
,FN_GET_INCIDENT_END_TIME(UI.USER_ID,UI.INCIDENT_DATE) AS END_TIME
,NVL(FN_GET_INCIDENT_END_TIME(UI.USER_ID,UI.INCIDENT_DATE),SYSDATE)-UI.INCIDENT_DATE AS DURATION
FROM T_USER_INCIDENT UI
WHERE STAT=1)
GROUP BY TRUNC(INCIDENT_DATE),USER_ID

/*================================*/
/*=======================================*/
/*         OUT PUT OF ABOVE QUERY        */
/*=======================================*/
/* 1    USER1   8/18/2010   04:25:48 */
/* 2    USER2   8/18/2010   06:04:15 */
/* 3    USER1   8/19/2010   07:14:09 */
/* 4    USER2   8/19/2010   07:42:26 */
/*=======================================*/
/* CREATING TABLE */
create table T_USER_INCIDENT
(
ID number
,STAT number(1)
,USER_ID varchar2(15)
,INCIDENT_DATE date
)
/*================================*/

/* CREATING SEQENCE */
create sequence SQ_USER_INCIDENT
start with 1 
increment by 1 
nomaxvalue;
/*================================*/

/* CREATE TRIGGER FOR ID INSERT */
create trigger TRIG_USER_INCIDENT
before insert on T_USER_INCIDENT
for each row
begin
select SQ_USER_INCIDENT.nextval into :new.id from dual;
end;
/
/*================================*/

/* INSERTING GIVEN SAMPLE  DATA */
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER1',TO_DATE('18.08.2010 13:10:14','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER1',TO_DATE('18.08.2010 15:15:40','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER1',TO_DATE('18.08.2010 16:15:10','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER1',TO_DATE('18.08.2010 18:35:32','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER2',TO_DATE('18.08.2010 07:05:46','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER2',TO_DATE('18.08.2010 13:10:01','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER1',TO_DATE('19.08.2010 09:01:10','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER1',TO_DATE('19.08.2010 16:15:19','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (1,'USER2',TO_DATE('19.08.2010 11:02:56','DD.MM.YYYY HH24:MI:SS'));
INSERT INTO T_USER_INCIDENT (STAT,USER_ID,INCIDENT_DATE) VALUES (2,'USER2',TO_DATE('19.08.2010 18:45:22','DD.MM.YYYY HH24:MI:SS'));
/*================================*/

/* CHECKING INSERTED DATA */
SELECT * FROM T_USER_INCIDENT

/*===================================================*/
/*               OUT PUT OF ABOVE QUERY              */
/*===================================================*/
/* 1    1   1   USER1   8/18/2010 1:10:14 PM */
/* 2    2   2   USER1   8/18/2010 3:15:40 PM */
/* 3    3   1   USER1   8/18/2010 4:15:10 PM */
/* 4    4   2   USER1   8/18/2010 6:35:32 PM */
/* 5    5   1   USER2   8/18/2010 7:05:46 AM */
/* 6    6   2   USER2   8/18/2010 1:10:01 PM */
/* 7    7   1   USER1   8/19/2010 9:01:10 AM */
/* 8    8   2   USER1   8/19/2010 4:15:19 PM */
/* 9    9   1   USER2   8/19/201011:02:56 AM */
/* 10   10  2   USER2   8/19/2010 6:45:22 PM */
/*===================================================*/

/*CREATING FUNCTION TO RETURN RESPECTED CLOSING TIME OF INCIDENT WITH GIVEN USER_ID */
CREATE OR REPLACE FUNCTION FN_GET_INCIDENT_END_TIME
(P_USER_ID IN T_USER_INCIDENT.USER_ID%TYPE,
 P_INCIDENT_START_TIME T_USER_INCIDENT.INCIDENT_DATE%TYPE)
RETURN T_USER_INCIDENT.INCIDENT_DATE%TYPE
IS
  V_INCIDENT_CLOSE_TIME T_USER_INCIDENT.INCIDENT_DATE%TYPE;
BEGIN
     SELECT MIN(CLOSE_TIMES)
     INTO V_INCIDENT_CLOSE_TIME
     FROM
     (SELECT A.INCIDENT_DATE AS CLOSE_TIMES
      FROM T_USER_INCIDENT A
      WHERE A.USER_ID=P_USER_ID AND A.INCIDENT_DATE>P_INCIDENT_START_TIME AND A.STAT=2);
      RETURN V_INCIDENT_CLOSE_TIME;
END FN_GET_INCIDENT_END_TIME;
/*================================*/

/* MAIN QUERY FOR OUT PUT */
SELECT USER_ID as "USER",TRUNC(INCIDENT_DATE) as "DATE",to_char(to_date('00:00:00','HH24:MI:SS') + SUM(DURATION), 'HH24:MI:SS') as "DURATION"
FROM
(SELECT
UI.USER_ID
,UI.INCIDENT_DATE
,FN_GET_INCIDENT_END_TIME(UI.USER_ID,UI.INCIDENT_DATE) AS END_TIME
,NVL(FN_GET_INCIDENT_END_TIME(UI.USER_ID,UI.INCIDENT_DATE),SYSDATE)-UI.INCIDENT_DATE AS DURATION
FROM T_USER_INCIDENT UI
WHERE STAT=1)
GROUP BY TRUNC(INCIDENT_DATE),USER_ID

/*================================*/
/*=======================================*/
/*         OUT PUT OF ABOVE QUERY        */
/*=======================================*/
/* 1    USER1   8/18/2010   04:25:48 */
/* 2    USER2   8/18/2010   06:04:15 */
/* 3    USER1   8/19/2010   07:14:09 */
/* 4    USER2   8/19/2010   07:42:26 */
/*=======================================*/
一身仙ぐ女味 2024-09-22 08:59:17
create table aa (id number(5), stat number(2), username varchar2(20), d date);

insert into aa
select 1,   1,   'USER1',   to_date('18.08.2010 13:10:14', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,   2,   'USER1',   to_date('18.08.2010 15:15:40', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,   1,   'USER1',   to_date('18.08.2010 16:15:10', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 4,   2,   'USER1',   to_date('18.08.2010 18:35:32', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 5,   1,   'USER2',   to_date('18.08.2010 07:05:46', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 6,   2,   'USER2',   to_date('18.08.2010 13:10:01', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 7,   1,   'USER1',   to_date('19.08.2010 09:01:10', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 8,   2,   'USER1',   to_date('19.08.2010 16:15:19', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 9,   1,   'USER2',   to_date('19.08.2010 11:02:56', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 10,  2,   'USER2',   to_date('19.08.2010 18:45:22', 'DD.MM.YYYY HH24:MI:SS') from dual 




    SELECT username, SomeDATE,
           to_char(to_date('00:00:00', 'HH24:MI:SS') + (duration), 'HH24:MI:SS') TIME
    FROM   (SELECT username, trunc(sd) AS SomeDate, SUM(duration) duration
             FROM   (SELECT id, Stat, username, d sd,
                             LEAD(d, 1) over(PARTITION BY username ORDER BY d, stat) - d duration
                      FROM   aa) t
             WHERE  Stat = 1
                    AND duration IS NOT NULL
             GROUP  BY username, trunc(sd))

输出

USER1   19.08.2010  07:14:09
USER2   18.08.2010  06:04:15
USER2   19.08.2010  07:42:26
USER1   18.08.2010  04:25:48
create table aa (id number(5), stat number(2), username varchar2(20), d date);

insert into aa
select 1,   1,   'USER1',   to_date('18.08.2010 13:10:14', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,   2,   'USER1',   to_date('18.08.2010 15:15:40', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,   1,   'USER1',   to_date('18.08.2010 16:15:10', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 4,   2,   'USER1',   to_date('18.08.2010 18:35:32', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 5,   1,   'USER2',   to_date('18.08.2010 07:05:46', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 6,   2,   'USER2',   to_date('18.08.2010 13:10:01', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 7,   1,   'USER1',   to_date('19.08.2010 09:01:10', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 8,   2,   'USER1',   to_date('19.08.2010 16:15:19', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 9,   1,   'USER2',   to_date('19.08.2010 11:02:56', 'DD.MM.YYYY HH24:MI:SS') from dual union all
select 10,  2,   'USER2',   to_date('19.08.2010 18:45:22', 'DD.MM.YYYY HH24:MI:SS') from dual 




    SELECT username, SomeDATE,
           to_char(to_date('00:00:00', 'HH24:MI:SS') + (duration), 'HH24:MI:SS') TIME
    FROM   (SELECT username, trunc(sd) AS SomeDate, SUM(duration) duration
             FROM   (SELECT id, Stat, username, d sd,
                             LEAD(d, 1) over(PARTITION BY username ORDER BY d, stat) - d duration
                      FROM   aa) t
             WHERE  Stat = 1
                    AND duration IS NOT NULL
             GROUP  BY username, trunc(sd))

output

USER1   19.08.2010  07:14:09
USER2   18.08.2010  06:04:15
USER2   19.08.2010  07:42:26
USER1   18.08.2010  04:25:48
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文