• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 513
  • Last Modified:

Comvert Varchar to Date Time and Then Do Date Math

Have a table A with:

Field 1) local_departuretime (varchar(17)) ex  MMDDYYYY_HH24MM or  12311999_1700
Field 2)gmt_departuretime(varchar(17)) ex. MMDDYYYY_HH24MM or 12311999_0300
Field 3)local_arrivaltime(varcahr(17)) ex. MMDDYYYY_HH24MM or 12311999_1400
Field 4)gmt_arrivaltime(carchar(17)) ex. MMDDYYYY_HH24MM or 12311999_0100

The MMDDYYYY stamp is based on the local departure time.


One
If the difference between the HH24MM (0300) of field  2 and  HH24MM(1700) field 1 is greater than 1200, and it is not the last day of the month and is not the last day of the year,  add 01 to the DD in field
2.

If the difference between the HH24MM (0300) of field  2 and  HH24MM(1700) field 1 is greater than 1200,  it is the last day of the month and is not the last day of the year,  add 01 to both the MMand DD of  field 2.

If the difference between the HH24MM (0300) of field  2 and  HH24MM(1700) field 1 is greater than 1200, it is the last day of the year,  add 01 to the MM, DD, and YYYY of field 2.

Two

If the HH24MM (0100) of field 4 is less than the HH24MM(0300) of field 2 and it is not the last day of
the month and it is not the last day of the year, add 01 to the DD in field 4.

If the HH24MM(0100) of field4 is less than the HH24MM(0300) of field 2 and it is the last day of the month and not the last day of the year add 01 to the MM and DD of field 4.

If the HH24MM(0100) of field4 is less than the HH24MM(0300) of field 2 and it is the last day of the year add 01 to the MM, DD, and YYYY of field 4.

Three

If the difference between the HH24MM (0100) of field  4 and  HH24MM(1400) field 3 is greater than 1200, and it is not the first day of the month and is not the first day of the year,  subtract  01 from the DD in field 3.

If the difference between the HH24MM (0100) of field  4 and  HH24MM(1400) field 3 is greater than 1200,  it is the first day of the month and is not the first day of the year,  subtract  01 from  both the MMand DD of  field 3.

If the difference between the HH24MM (0100) of field  4 and  HH24MM(1400) field 3 is greater than 1200, it is the first day of the year,  subtract 01 from  the MM, DD, and YYYY of field 3


The output for the examples would be

Field 1) local_departuretime (varchar(17)) ex  MMDDYYYY_HH24MM or  12311999_1700
Field 2)gmt_departuretime(varchar(17)) ex. MMDDYYYY_HH24MM or 01012000_0300
Field 3)local_arrivaltime(varcahr(17)) ex. MMDDYYYY_HH24MM or 01012000_1400
Field 4)gmt_arrivaltime(carchar(17)) ex. MMDDYYYY_HH24MM or 01022000_0100


Is there a way to code this effectively with a procedure in Oracle 8i and if so
how would u code the procedure.

Thanks
0
tomatocans
Asked:
tomatocans
  • 4
  • 4
1 Solution
 
jyhuangCommented:

Hi, your example output does match your logic. Based on your logic, the output of Field 3 should be 12301999_1400, not 01012000_1400. The following codes follows your logic not your example. FYI, when you add 1 to a date type column, Oracle takes care of the end of month or year automatically. The query below gives you 20000101

select to_date('19991231','yyyymmdd') + 1
from dual;

procedure my_proc is
cursor a_cursor is
  select rowid -- or your Primary key,
         to_number(substr(local_departuretime,10,4)) local_departuretime,
         to_number(substr(gmt_departuretime, 10,4)) gmt_departuretime,
         to_number(substr(local_arrivaltime, 10,4)) local_arrivaltime,
         to_number(substr(gmt_arrivaltime, 10,4)) gmt_arrivaltime
  from table_A;
begin
  for a_record in a_cursor loop
      -- This covers Case One
      if (a_record.local_departuretime - a_record.gmt_departuretime) > 1200 then
         update table_A
         set gmt_departuretime = to_char(to_date(gmt_departuretime,'MMDDYYYY_HH24MI') + 1, 'MMDDYYYY_HH24MI')
         where rowid = a_record.rowid;
      end if;

      -- This covers Case Two
      if a_record.gmt_arrivaltime < a_record.gmt_departuretime then
         update table_A
         set gmt_arrivaltime = to_char(to_date(gmt_arrivaltime,'MMDDYYYY_HH24MI') + 1, 'MMDDYYYY_HH24MI')
         where rowid = a_record.rowid;
      end if;
 
      -- This covers Case Three
      if (a_record.local_arrivaltime - a_record.gmt_arrivaltime) > 12 then
         update table_A
         set local_arrivaltime = to_char(to_date(local_arrivaltime,'MMDDYYYY_HH24MI') - 1, 'MMDDYYYY_HH24MI')
         where rowid = a_record.rowid;
      end if;
  end loop;
exception
  when others then
    -- handle your exception here
    null;
end my_proc;
0
 
jyhuangCommented:

I meant your output example does NOT match your logic.
0
 
tomatocansAuthor Commented:
Sorry about the error in logic. Will this also handle
the last day of the month and year scenarios.

Thanks dude.
0
Get free NFR key for Veeam Availability Suite 9.5

Veeam is happy to provide a free NFR license (1 year, 2 sockets) to all certified IT Pros. The license allows for the non-production use of Veeam Availability Suite v9.5 in your home lab, without any feature limitations. It works for both VMware and Hyper-V environments

 
konektorCommented:
oracle has quite good functions to manipulate with date and time

select sysdate from dual;
16.5.2000 14:31:25

1.
select sysdate+1 from dual;
17.5.2000 14:31:25
2.
select sysdate-1 from dual;
15.5.2000 14:31:25
3.
select add_months(sysdate,-1) from dual;
16.4.2000 14:31:25
4.
select last_day(sysdate) from dual;
31.5.2000 14:31:25
5.
select trunc(sysdate,'mi') from dual;
16.5.2000 14:31:00
6.
select trunc(sysdate,'hh') from dual;
16.5.2000 14:00:00
7.
select trunc(sysdate,'dd') from dual;
16.5.2000 00:00:00
8.
select trunc(sysdate,'mm') from dual;
1.5.2000 00:00:00
9.
select trunc(sysdate,'yyyy') from dual;
1.1.2000 00:00:00

....

0
 
tomatocansAuthor Commented:
The code has to be flexible enough to work with all dates not just 12/31

any help appreciated
0
 
jyhuangCommented:

The code I gave handles last day of month and year. As I said, Oracle take care of it. Run queries below in SQL*PLUS, see what you get.

select to_date('12/31/1999','mm/dd/yyyy') + 1
from dual;

select to_date('11/30/1999','mm/dd/yyyy') + 1
from dual;

0
 
tomatocansAuthor Commented:
how do u change your procedure to handle all dates from 01011999 to the present.
0
 
jyhuangCommented:

I am not quite sure about your question. Could you detail your requirement?
0
 
tomatocansAuthor Commented:
Thanks
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now