简体   繁体   中英

How to Round up timestamp to number of Days?

PreparedStatement psnmt=con.prepareStatement("SELECT (?)-(?) as DiffDate FROM dual");
psnmt.setTimestamp(1,ctenderdate);
psnmt.setTimestamp(2,btenderdate);
ResultSet resrt=psnmt.executeQuery();
if(!resrt.next())
{
     out.println("No Records Found");
}
else
{
  do
     {
        datediff=resrt.getString("DiffDate");
     }
  while(resrt.next()); 
  System.out.println("the no of days Difference"+datediff);

}

ctenderdate=2015-06-27 00:00:00.0

btenderdate=2015-06-29 00:00:00.0

datediff=1 10:18:51.940000000

Expected datediff=2

How to round it off datediff to number of days

EDIT

Subtract TIMESTAMP values

If we really want to subtract two TIMESTAMP values, then we have to work with the INTERVAL DAY TO SECOND datatype that's returned. The easiest way to work with that is to use the EXTRACT function.

If want to return integer number of days (emulating the CEIL function) then we could test whether any part of the time ( HOUR , MINUTE , SECOND ) was non-zero. If they are all zero, we can use just the DAY portion. Otherwise, we have to add 1 to the DAY portion, and return that.

For example:

  SELECT EXTRACT(DAY FROM diff.idts) 
         + CASE 
             WHEN EXTRACT(HOUR   FROM diff.idts) > 0 
               OR EXTRACT(MINUTE FROM diff.idts) > 0
               OR EXTRACT(SECOND FROM diff.idts) > 0
             THEN 1
             ELSE 0
           END
         AS days_diff
    FROM ( SELECT ? - ? AS idts FROM dual ) diff

ORIGINAL ANSWER

For Oracle database, you can perform this operation in the database:

SELECT CEIL(TO_DATE(?,'YYYY-MM-DD HH24:MI:SS.F')-TO_DATE(?,'YYYY-MM-DD HH24:MI:SS.F'))
  FROM dual 

This assumes the bind parameters are passed as strings, in format that matches the format model specified in the TO_DATE function, for example:

  '2015-06-27 14:45:21.0'

(I'm assuming Oracle because of the use of the dual table, and because you are using subtraction operation between two dates. You would need a different statement for a different database.)

To unpack that expression a little bit...

The Oracle TO_DATE function converts a character string into an Oracle DATE value. The second argument is the format model, specifies that format of the first argument.

A subtraction operation between two DATE values returns the difference as a number of days (integer days plus fractional days.)

The CEIL function rounds a non-integer value up to the next higher integer.

FOLLOWUP

Q: how to use it with timestamp?

A: A subtraction of two TIMESTAMP values gets returned as an INTERVAL DAY TO SECOND datatype. And I'd prefer to avoid working with that.

In Oracle, when we do a subtraction of two DATE values, we get a decimal number. That's much easier to work with.

And in terms of "rounding" up a difference in days, I'm fine with disregarding fractional seconds.

If I had to pass in TIMESTAMP values, I would convert them to DATE values. The expressions above are already expecting string values, so I would just replace the ? with

 TO_CHAR(?,'YYYY-MM-DD HH24:MI:SS')

If I had a requirement to pass in TIMESTAMP datatype, and return integer days difference rounded up, I would use a query like this:

 SELECT CEIL( TO_DATE(TO_CHAR( ? ,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
            - TO_DATE(TO_CHAR( ? ,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
        ) AS days_diff
  FROM dual 

Check out this link . There are answers for results in hours or minutes. What you are looking for should be similar.

My bad. I should not post just-a-link-answers. What you can do, as described there is:

SELECT TRUNC (SYSDATE) - TO_DATE ('10/20/2012', 'mm/dd/yyyy') FROM DUAL;

Notice the following details:

ENDDATE - STARTDATE will give you a number that corresponds to the number of days between the two dates.

If you want the result in hours, multiply by 24; if minutes, multiply by 24*60 and so forth.

You can also convert the result to an INTERVAL. There are two type of intervals: NUMTODSINTERVAL(ENDDATE - STARTDATE, 'DAY') or NUMTOYMINTERVAL(ENDDATE - STARTDATE, 'DAY')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM