Ваш NLS_DATE_FORMAT, вероятно, настроен на отображение только части даты.Это работает для меня:
SELECT
to_char( TRUNC(timestamp'2011-02-24 08:30:42 +06:00', 'HH'), 'YYYY-MM-DD HH24:MI:SS' )
FROM DUAL;
Имейте в виду, что возвращаемый результат - ДАТА, поэтому вы теряете любую информацию о локализации.Вы можете вернуть нормализованную по времени GMT метку времени, приведя результат к метке времени:
SELECT
to_char( from_tz( cast( TRUNC(timestamp'2011-02-24 08:30:42 +06:00' at time zone 'GMT', 'HH' ) as timestamp ), 'GMT' ), 'YYYY-MM-DD HH24:MI:SS TZR' )
FROM DUAL;
Чтобы сохранить информацию о часовом поясе, вы должны сделать что-то довольно запутанное.Может быть проще использовать хранимую функцию для выполнения преобразования в этой точке.Это работает так же, как встроенная в Oracle функция TRUNC ():
create or replace function trunc_timestamp(
ts in timestamp_tz_unconstrained,
fmt in varchar2
)
return timestamp_tz_unconstrained
is
tzone varchar2(20);
begin
tzone := extract( timezone_region from ts );
if tzone = 'UNKNOWN' then
tzone := to_char( extract( timezone_hour from ts ), 'fm09' )
|| ':'
|| to_char( extract( timezone_minute from ts ), 'fm09' );
end if;
return from_tz( cast( TRUNC( ts at time zone tzone, fmt ) as timestamp ), tzone );
end;
/
Я создал sqlfiddle для демонстрации.