Я написал функцию для преобразования даты в метку времени Unix.Функция написана для работы независимо от текущего статуса DST (например, EST или EDT).Это функция:
function unix_time_from_date(in_date in date) return number
as
ut number := 0;
tz varchar2(8) := '';
begin
-- Get the local timezone from the passed in date
-- Assuming the date supplied is for the local time zone
select
extract(
timezone_abbr from cast(in_date as timestamp with local time zone)
)
into tz
from dual;
-- Get the Unix timestamp
select
(new_time(in_date, tz, 'GMT') - to_date('01-JAN-1970', 'DD-MM-YYYY')) * (
86400)
into ut
from dual;
return ut;
end unix_time_from_date;
Эта функция прекрасно работает, когда я выполняю ее с такого клиента, как JDeveloper.Из того, что я понял, это связано с тем, что клиент предоставляет информацию о часовом поясе для первого запроса.Однако, если я использую функцию внутри процедуры, которая вызывается со страницы mod_plsql, я получаю ошибку ORA-01857: not a valid time zone
.Эта ошибка вызывается из функции new_time
, потому что tz
имеет значение 'UNK'
.
Итак, я реализовал обходной путь для этой проблемы следующим образом:
function unix_time_from_date(in_date in date) return number
as
ut number := 0;
tz varchar2(8) := '';
begin
-- Get the local timezone from the passed in date
-- Assuming the date supplied is for the local time zone
select
extract(
timezone_abbr from cast(in_date as timestamp with local time zone)
)
into tz
from dual;
if tz = 'UNK' then
select
extract(
timezone_abbr from cast(sysdate as timestamp with local time zone)
)
into tz
from dual;
end if;
-- Get the Unix timestamp
select
(new_time(in_date, tz, 'GMT') - to_date('01-JAN-1970', 'DD-MM-YYYY')) * (
86400)
into ut
from dual;
return ut;
end unix_time_from_date;
За исключением того, что это все еще терпит неудачу с tz
, установленным в 'UNK'
.Кто-нибудь знает, что здесь может происходить?Почему я не могу получить сокращение местного часового пояса, когда функция вызывается из процесса сервера приложений Oracle?