在 Informix 中将 nchar 字段添加到 DateTime

Add nchar field to DateTime in Informix

我有一个 datetime 字段以 UTC 格式存储时间。还有另一个 nchar 字段存储基于位置的时区差异。我正在尝试将两者结合起来生成报告,以便显示的时间与适当的时区相匹配。

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

虽然这在技术上适用于当前情况,但我真的不喜欢在 time_zone 字段上使用 CASTLEFT 函数,因为如果值不是消极的。似乎有更好的解决方案,可能是 TO_CHAR。在 informix 数据库中,合并 dateimenchar 字段以便输出时间正确的正确方法是什么?理想情况下,我想以非 24 小时格式(下午 4:00 等)输出,但此时我主要关注获得正确的时间。

理想情况下,您的时区列应该是 INTERVAL HOUR TO MINUTE 类型;然后您只需添加两列即可获得所需的结果。由于它是字符类型,因此需要某种形式的子串。使用 LEFT 是一种选择; SUBSTRING 是另一个;使用 Informix 下标符号是另一种方法。 CAST 并不重要; Informix 非常擅长强制操作。

除非您实际上只想要结果中的小时和分钟(这是一个合理的选择),否则您的 EXTEND 操作是不必要和不受欢迎的;这意味着您的结果将不包括数据中的秒值。

请注意,某些时区包括分钟值。纽芬兰时间为 UTC-04:30;印度在 UTC+05:30;尼泊尔时间为 UTC+05:45。 (有关详细信息,请参阅 World Time Zone。)获得准确的分钟更难,因为符号必须经过。

关于 AM/PM 表示法中的格式,除了问题 'why' 之外,答案是使用 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:

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

注意当时区表示为 INTERVAL HOUR TO MINUTE 时要容易得多:

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