2015-11-24 3 views
1

У меня есть поле datetime, которое хранит время в формате UTC. Есть еще одно поле nchar, которое хранит разницу в часовом поясе на основе местоположения. Я пытаюсь объединить эти два для отчета, чтобы отображаемое время соответствовало соответствующему часовому поясу.Добавить поле nchar в DateTime в Informix

time_stamp   | time_zone 
--------------------------------- 
2015-11-24 21:00:00 | -0500 
2015-11-23 15:00:00 | -0600 

Ожидаемый результат:

2015-11-24 16:00:00 
2015-11-23 09:00:00 

Я был в состоянии получить эту работу с помощью:

extend(time_stamp, year to minute) + (CAST(LEFT(time_zone,3) as int)) units hour 

Хотя это технически работает для текущей ситуации, я действительно не люблю используя функции CAST и LEFT в поле time_zone, так как он ломается, если значение не является отрицательным. Похоже, есть гораздо лучшее решение, возможно что-то с TO_CHAR. В базе данных informix, каков правильный способ объединить поля dateime и nchar так, чтобы время вывода было правильным? В идеале я хотел бы выводить в формате не 24 часа (4:00 вечера и т. Д.), Но на данный момент я в основном сосредоточен на получении правильного времени.

ответ

1

В идеале, ваш часовой пояс будет иметь тип 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 
Смежные вопросы