В идеале, ваш часовой пояс будет иметь тип INTERVAL HOUR TO MINUTE
; вы просто добавили бы два столбца, чтобы получить желаемый результат. Так как это тип символа, потребуется подстрока в некоторой форме. Использование LEFT - один из вариантов; SUBSTRING - другое; использование нотации подкласса Informix - другое. CAST не имеет решающего значения; Informix очень хорош в вопросах принуждения.
Если вы действительно хотите получить только часы и минуты (что является законным выбором), ваша операция EXTEND не нужна и нежелательна; это означает, что ваш результат не будет включать значение секунд из ваших данных.
Обратите внимание, что в некоторых часовых поясах указаны значения минут. Ньюфаундленд находится на UTC-04: 30; Индия находится по UTC + 05: 30; Непал находится по UTC + 05: 45. (Дополнительную информацию см. В разделе World Time Zone.) Получение точных минут сложнее, потому что знак должен быть перенесен.
Что касается форматирования в нотации AM/PM, то помимо вопроса «почему» ответ заключается в использовании функции TO_CHAR() и ghastligram, выражающей желаемый формат времени.
Демонстрация:
create table zone_char(time_stamp datetime year to second, time_zone nchar(5));
insert into zone_char values('2015-11-24 21:00:00', '-0500');
insert into zone_char values('2015-11-23 15:00:00', '-0600');
insert into zone_char values('2015-11-22 17:19:21', '+0515');
insert into zone_char values('2015-11-21 02:56:31', '-0430');
Различные способы выбора данных:
select extend(time_stamp, year to minute) + LEFT(time_zone,3) units hour,
time_stamp + LEFT(time_zone,3) units hour,
time_stamp + time_zone[1,3] units hour,
time_stamp + time_zone[1,3] units hour + (time_zone[1] || time_zone[4,5]) units minute,
TO_CHAR(time_stamp + time_zone[1,3] units hour + (time_zone[1] || time_zone[4,5]) units minute,
'%A %e %B %Y %I.%M.%S %p')
from zone_char;
Пример вывода:
2015-11-24 16:00 2015-11-24 16:00:00 2015-11-24 16:00:00 2015-11-24 16:00:00 Tuesday 24 November 2015 04.00.00 PM
2015-11-23 09:00 2015-11-23 09:00:00 2015-11-23 09:00:00 2015-11-23 09:00:00 Monday 23 November 2015 09.00.00 AM
2015-11-22 22:19 2015-11-22 22:19:21 2015-11-22 22:19:21 2015-11-22 22:34:21 Sunday 22 November 2015 10.34.21 PM
2015-11-20 22:56 2015-11-20 22:56:31 2015-11-20 22:56:31 2015-11-20 22:26:31 Friday 20 November 2015 10.26.31 PM
И обратите внимание, насколько легче, когда временная зона представлена как интервальной ЧАС НА МИНУТУ:
alter table zone_char add hhmm interval hour to minute;
update zone_char set hhmm = time_zone[1,3] || ':' || time_zone[4,5];
SELECT:
select time_stamp, hhmm, extend(time_stamp + hhmm, year to minute),
time_stamp + hhmm,
TO_CHAR(time_stamp + hhmm, '%A %e %B %Y %I.%M.%S %p')
from zone_char;
Результат:
2015-11-24 21:00:00 -5:00 2015-11-24 16:00 2015-11-24 16:00:00 Tuesday 24 November 2015 04.00.00 PM
2015-11-23 15:00:00 -6:00 2015-11-23 09:00 2015-11-23 09:00:00 Monday 23 November 2015 09.00.00 AM
2015-11-22 17:19:21 5:15 2015-11-22 22:34 2015-11-22 22:34:21 Sunday 22 November 2015 10.34.21 PM
2015-11-21 02:56:31 -4:30 2015-11-20 22:26 2015-11-20 22:26:31 Friday 20 November 2015 10.26.31 PM