Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Epoch functions #135

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
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