Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 17 additions & 44 deletions source/packages/oos_util_date.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,23 @@ as
* @return Unix Epoch time
*/
function date2epoch(
p_date in date)
p_date timestamp,
p_date_in_tzr in varchar2 default sessiontimezone)
return number
as
$if dbms_db_version.version >= 12 $then
pragma udf;
$end

l_tswtz timestamp with time zone;
l_start timestamp with time zone := to_timestamp_tz('19700101 utc', 'yyyymmdd tzr');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use a package level constant:

epoch constant timestamp with time zone := timestamp '1970-01-01 00:00:00 +00:00';

instead of l_start.

begin
return
round(
(p_date - to_date ('19700101', 'yyyymmdd')) * 86400
- (to_number(substr (tz_offset (sessiontimezone), 1, 3))+0) * 3600); -- Note: Was +1 but was causing 1 hour behind (#123)
l_tswtz := from_tz(p_date, p_date_in_tzr) at time zone 'utc';

return round((extract (day from l_tswtz - l_start) * 86400000)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Define constants for the magic numbers.

+ (extract (hour from l_tswtz - l_start) * 3600000)
+ (extract (minute from l_tswtz - l_start) * 60000)
+ (extract (second from l_tswtz - l_start) * 1000));
end date2epoch;


Expand All @@ -59,48 +65,15 @@ as
* @return date
*/
function epoch2date(
p_epoch in number)
return date
p_epoch in number,
p_date_out_tzr in varchar2 default sessiontimezone)
return timestamp with time zone
as

l_tswtz timestamp with time zone;
begin
return
to_date ('19700101', 'yyyymmdd')
+ ((p_epoch + ((to_number(substr(tz_offset(sessiontimezone), 1, 3))+0) * 3600)) / 86400); -- Note: Was +1 but was causing 1 hour ahead (#123)
l_tswtz := to_timestamp_tz('19700101 utc', 'yyyymmdd tzr') + numtodsinterval(p_epoch/86400000, 'day');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the constant:

l_tswtz := epoch + numtodsinterval(p_epoch/86400000, 'day');

And define a constant for magic number 86400000.

return l_tswtz at time zone (p_date_out_tzr);
end epoch2date;


/*!
* Coverts timestamp to Unix Epoch time
*
* @private Currently used for crypto. Needs more testing to make puplically available.
*
* @example
*
* select oos_util_date.timestamp2epoch(current_timestamp)
* from dual;
*
* OOS_UTIL_DATE.TIMESTAMP2EPOCH(CURRENT_TIMESTAMP)
* ---------------------------------
* 1474277938
*
* @author Adrian Png
* @created 22-Sep-2016
* @param p_timestamp Timestamp to convert to Epoch format
* @return Unix Epoch time
*/
function timestamp2epoch(
p_timestamp in timestamp)
return pls_integer
as
c_start_time constant timestamp with time zone := timestamp '1970-01-01 00:00:00 +00:00';
begin
return extract(day from (p_timestamp - c_start_time)) * 86400
+ extract(hour from (p_timestamp - c_start_time)) * 3600
+ extract(minute from (p_timestamp - c_start_time)) * 60
+ extract(second from (p_timestamp - c_start_time))
;
end timestamp2epoch;


end oos_util_date;
Expand Down
13 changes: 5 additions & 8 deletions source/packages/oos_util_date.pks
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
create or replace package oos_util_date
as

function date2epoch(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make this a deterministic function.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we also have a p_date in timestamp with time zone version ?

p_date in date)
p_date timestamp,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing in.

p_date_in_tzr in varchar2 default sessiontimezone)
return number;

function epoch2date(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make this a deterministic function.

p_epoch in number)
return date;

function timestamp2epoch(
p_timestamp in timestamp)
return pls_integer;
p_epoch in number,
p_date_out_tzr in varchar2 default sessiontimezone)
return timestamp with time zone;

end oos_util_date;
/