Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Difference between dates stored in Same column

Posted on 2009-05-10
7
Medium Priority
?
1,080 Views
Last Modified: 2013-12-19
Hi Experts
I am actually stuck with a logic problem on a SQL query in Oracle.  
I need the difference between two dates (that are in date datatypes) that are in same column.
I tried using the ROW_NUMBER () OVER (PARTITION BY) concept but its yielding incorrect values at some places. The "Days in each status" output column is what I am looking for.  The status id is the column which has few set of statuses which get repeated for each unique person.

STATUS_CHANGE_DATE      status_id      Days in each status
            
4/9/2009 6:51      220      0 (there is no value above it so it should be 0)
4/6/2009 7:57      114      4 (diff between the 4/9 and 4/6 incl both the days)
4/6/2009 7:56      6      1 (diff between 4/6 =0 but should consider it as1)
4/6/2009 7:56      5      1
3/30/2009 14:30      111      8 (diff between 4/6 and t3/30)
3/26/2009 9:04      208      5 (diff between 3/30 and 3/26)
3/25/2009 16:17      49      2 (diff between 3/26 and 3/25)

Thanks
0
Comment
Question by:gvsbnarayana
  • 4
  • 3
7 Comments
 
LVL 25

Expert Comment

by:lwadwell
ID: 24351337
Hi gvsbnarayana,

The LAG() function would be better than the ROW_NUMBER() for this I think.  What is your PARTITION BY column(s)?  The LAG() function allows you to look back 'n' rows (the other one is LEAD() which allows you to look forward 'n' rows).  You could do something like

SELECT status_change_date, LAG(status_change_date,1,null) OVER(partition by some_column ORDER BY status_change_date) as prev_date
FROM ...

lwadwell
0
 
LVL 8

Author Comment

by:gvsbnarayana
ID: 24351366
My partition column is the status_id as per the above example I provided. I tried using the lag but no luck.
0
 
LVL 25

Expert Comment

by:lwadwell
ID: 24351373
lwadwell,

please show me your SQL.

lwadwell
0
Visualize your virtual and backup environments

Create well-organized and polished visualizations of your virtual and backup environments when planning VMware vSphere, Microsoft Hyper-V or Veeam deployments. It helps you to gain better visibility and valuable business insights.

 
LVL 8

Author Comment

by:gvsbnarayana
ID: 24351410
SELECT   (SELECT user_status
            FROM apps.per_assignment_status_types
           WHERE assignment_status_type_id =
                                           a.assignment_status_type_id)
                                                                       status,
         (a.status_change_date - b.status_change_date) AS days,        
         a.arowno,
         b.browno
    FROM (SELECT assignment_status_id, status_change_date, assignment_id,
                 assignment_status_type_id,
                 ROW_NUMBER () OVER (PARTITION BY assignment_status_type_id ORDER BY status_change_date)
                                                                       arowno
            FROM apps.irc_assignment_statuses) a,
         (SELECT assignment_status_id, status_change_date, assignment_id,
                 assignment_status_type_id,
                 ROW_NUMBER () OVER (PARTITION BY assignment_status_type_id ORDER BY status_change_date)
                                                                       browno
            FROM apps.irc_assignment_statuses) b
   WHERE a.assignment_status_type_id = b.assignment_status_type_id
     AND a.arowno - 1 = b.browno
     AND b.assignment_id = 649650
     order by a.status_change_date
0
 
LVL 25

Accepted Solution

by:
lwadwell earned 500 total points
ID: 24351475
gvsbnarayana,

Try this simple SQL first ...

BTW.  Are you sure the partitioning key is assignment_status_type_id?  These values must be the same across the multiple rows to form a partion.  Your examples in the original question had the values as different for each row.

lwadwell

SELECT assignment_status_id, 
       assignment_id,
       assignment_status_type_id,
       status_change_date, 
       LAG (status_change_date,1,null) OVER (PARTITION BY assignment_id ORDER BY status_change_date) prev_date
  FROM apps.irc_assignment_statuses
 WHERE assignment_id = 649650
 ORDER BY assignment_status_id, 
       status_change_date

Open in new window

0
 
LVL 8

Author Comment

by:gvsbnarayana
ID: 24351527
The Assignment Status Type id gets repeated to each Assignment id. The Assignment Status table holds the lookup values for the statuses table. So, per defintion, to form a partition I considered the  assignment status type_id as the partition key. I think that was the mistake I did.

But as per the above query I got the values for the prev value as you considered the assignment id itself and I made my modifications accordingly.

Awesome...
Thanks for the idea.  
0
 
LVL 8

Author Closing Comment

by:gvsbnarayana
ID: 31580018
Thanks for showing me the right direction
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
From implementing a password expiration date, to datatype conversions and file export options, these are some useful settings I've found in Jasper Server.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function
This video shows how to configure and send email from and Oracle database using both UTL_SMTP and UTL_MAIL, as well as comparing UTL_SMTP to a manual SMTP conversation with a mail server.
Suggested Courses

927 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question