Thursday, February 17, 2011

Oracle: how to add minutes to a timestamp?

I need to add 30 minutes to values in a Oracle date column. I do this in my SELECT statement by specifying "to_char(date_and_time + (.000694 * 31)", which works fine most of the time. But not when the time is on the AM/PM border. For example, adding 30 minutes to "12:30" [which is PM] returns "1:00" which is AM. The answer I expect is "13:00". What's the correct way to do this?

From stackoverflow
  • Be sure that Oracle understands that the starting time is PM, and to specify the HH24 format mask for the final output.

    SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
      FROM dual
    
    TIME
    ---------
    13:10
    

    Note: the 'AM' in the HH:MI is just the placeholder for the AM/PM meridian indicator. Could be also 'PM'

  • If the data type of the field is date or timestamp, Oracle should always give the correct result if you add the correct number given in number of days (or a the correct fraction of a day in your case). So if you are trying to bump the value in 30 minutes, you should use :

    select field + 0.5/24 from table;
    

    Based on the information you provided, I believe this is what you tried to do and I am quite sure it works.

    Sajee : The above answer w/o using to_char on it provides just the default format, eg: 04-NOV-08. Which is not what I'm looking for.
  • In addition to being able to add a number of days to a date, you can use interval data types assuming you are on 9i or later, which can be somewhat easier to read,

    SQL> ed
    Wrote file afiedt.buf
    
      1  SELECT sysdate, sysdate + interval '30' minute
      2*   FROM dual
    SQL> /
    
    SYSDATE              SYSDATE+INTERVAL'30'
    -------------------- --------------------
    02-NOV-2008 16:21:40 02-NOV-2008 16:51:40
    
    David Oneill : +1 This was what I was looking for!
    wheelibin : +1 Wow, I never knew this...I can finally drop the ridiculous fractions of a day stuff!
  • Based on what you're asking for, you want the HH24:MI format for to_char.

  • All of the other answers are basically right but I don't think anyone's directly answered your original question.

    Assuming that "date_and_time" in your example is a column with type DATE or TIMESTAMP, I think you just need to change this:

    to_char(date_and_time + (.000694 * 31))
    

    to this:

    to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')
    

    It sounds like your default date format uses the "HH" code for the hour, not "HH24".

    Also, I think your constant term is both confusing and imprecise. I guess what you did is calculate that (.000694) is about the value of a minute, and you are multiplying it by the number of minutes you want to add (31 in the example, although you said 30 in the text).

    I would also start with a day and divide it into the units you want within your code. In this case, (1/48) would be 30 minutes; or if you wanted to break it up for clarity, you could write ( (1/24) * (1/2) ).

    This would avoid rounding errors (except for those inherent in floating point which should be meaningless here) and is clearer, at least to me.

  • Thank you to everyone. This is VERY useful!

  • from http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

    The SYSDATE pseudo-column shows the current system date and time. Adding 1 to SYSDATE will advance the date by 1 day. Use fractions to add hours, minutes or seconds to the date

    SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;
    
    SYSDATE              SYSDATE+1/24         SYSDATE+1/1440       SYSDATE+1/86400
    -------------------- -------------------- -------------------- --------------------
    03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13
    

0 comments:

Post a Comment