Вообще, любые конструкции, берущие только разность дат, будут работать некорректно, поскольку разность дат берется всегда в одном часовом поясе. Если же между датами был переход на летнее/зимнее время, то и пояс поменяется.
Вот пример функции, возвращающей количество секунд от 1 января 1970 года по гринвичу до указанной даты в временной зоны Москвы, которая учитывает летнее/зимнее время:
CREATE OR REPLACE FUNCTION unixtime(x DATE)
return number as
begin
return (x - to_date('01011970','ddmmyyyy'))*24*60*60
-extract(TIMEZONE_HOUR from FROM_TZ(cast(x as timestamp),'Europe/Moscow'))*3600;
end;
select unixtime(to_date('2008-07-15 15:22:01','YYYY-MM-DD HH24:MI:SS'))
-unixtime(to_date('2005-06-15 15:22:01','YYYY-MM-DD HH24:MI:SS')) from dual;
97286400 |