jwj
jwj

Reputation: 15

how to convert date format in sql

if i have dates/time like these

8/5/2014 12:00:01 AM
8/5/2014 12:00:16 AM
8/5/2014 12:00:18 AM
8/5/2014 12:17:18 AM
8/5/2014 12:19:18 AM

i want these date/times

i need to do that for my report how can i apply these in oracle

Upvotes: 0

Views: 220

Answers (4)

Gordon Linoff
Gordon Linoff

Reputation: 1269483

Here is one method. Extract the date and then add in what you want as hours and minutes:

select trunc(dt) + extract(hour from dt) / 24.0 +
       (trunc(extract(minute from dt) / 15) * 15) / (24.0 * 60);

This uses the fact that + for dates adds a number of days. The three terms are the original date at midnight, the number of hours converted to days (hence the / 24) and the third is the number of minutes, suitably rounded.

Upvotes: 1

Ben
Ben

Reputation: 52853

To add yet another method this looks like a situation where the function NUMTODSINTERVAL() could be useful - it makes it slightly more obvious what's happening:

select trunc(dt) 
       + numtodsinterval(trunc(to_char(dt, 'sssss') / 900) * 15, 'MINUTE')
  from ...

TRUNC() truncates the date to the beginning of that day. The format model sssss calculates the number of seconds since midnight. The number of complete quarter-hours since midnight is the number of seconds divided by 900 (as there are 900 quarter-hours in the day). This is truncated again to remove any part-completed quarter-hours, multipled by 15 to give the number of minutes (there are 15 minutes in a quarter hour). Lastly, convert this to an INTERVAL DAY TO SECOND and add to the original date.

SQL> alter session set nls_date_format = 'dd/mm/yyyy hh24:mi:ss';

Session altered.

SQL> with t as (
  2   select to_date('05/08/2014 12:00:01') as dt from dual union all
  3   select to_date('05/08/2014 12:00:16') as dt from dual union all
  4   select to_date('05/08/2014 12:00:18') as dt from dual union all
  5   select to_date('05/08/2014 12:17:18') as dt from dual union all
  6   select to_date('05/08/2014 12:19:18') as dt from dual union all
  7   select to_date('05/08/2014 12:37:37') as dt from dual union all
  8   select to_date('05/08/2014 12:51:51') as dt from dual
  9  )
 10  select trunc(dt)
 11         + numtodsinterval(trunc(to_char(dt, 'sssss') / 900) * 15, 'MINUTE')
 12    from t
 13         ;

TRUNC(DT)+NUMTODSIN
-------------------
05/08/2014 12:00:00
05/08/2014 12:00:00
05/08/2014 12:00:00
05/08/2014 12:15:00
05/08/2014 12:15:00
05/08/2014 12:30:00
05/08/2014 12:45:00

7 rows selected.

I've explicitly set my NLS_DATE_FORMAT so I can rely on implicit conversion in TO_DATE() so that it fits on the page without scrolling. It is not recommended to use implicit conversion normally.

Upvotes: 1

Alex Poole
Alex Poole

Reputation: 191235

Here's another method, which is really a variation of Gordon Linoff's approach:

trunc(dt, 'HH24') + ((15/1440) * (floor(to_number(to_char(dt, 'MI'))/15)))

The trunc(dt, 'HH24') gives you the value truncated to hour precision, so for your sample that's always midnight. Then floor(to_number(to_char(dt, 'MI'))/15) gives you the number of complete 15-minute periods represented by the minute value; with your data that's either zero or 1. As Gordon mentioned when you add a numeric value to a date it's treated as fractions of a day, so that needs to be multiplied by '15 minutes' (15/1400).

with t as (
  select to_date('8/5/2014 12:00:01 AM') as dt from dual
  union all select to_date('8/5/2014 12:00:16 AM') as dt from dual
  union all select to_date('8/5/2014 12:00:18 AM') as dt from dual
  union all select to_date('8/5/2014 12:17:18 AM') as dt from dual
  union all select to_date('8/5/2014 12:19:18 AM') as dt from dual
  union all select to_date('8/5/2014 12:37:37 AM') as dt from dual
  union all select to_date('8/5/2014 12:51:51 AM') as dt from dual
)
select dt, trunc(dt, 'HH24')
    + ((15/1440) * (floor(to_number(to_char(dt, 'MI'))/15))) as new_dt
from t;

DT                     NEW_DT               
---------------------- ----------------------
08/05/2014 12:00:01 AM 08/05/2014 12:00:00 AM 
08/05/2014 12:00:16 AM 08/05/2014 12:00:00 AM 
08/05/2014 12:00:18 AM 08/05/2014 12:00:00 AM 
08/05/2014 12:17:18 AM 08/05/2014 12:15:00 AM 
08/05/2014 12:19:18 AM 08/05/2014 12:15:00 AM 
08/05/2014 12:37:37 AM 08/05/2014 12:30:00 AM 
08/05/2014 12:51:51 AM 08/05/2014 12:45:00 AM 

Upvotes: 1

LiborStefek
LiborStefek

Reputation: 410

Here is an example for ORACLE with actual date:

select trunc(sysdate,'HH')+trunc(to_number(to_char(sysdate,'MI'))/15)*15/24/60
from dual;

Upvotes: 0

Related Questions