在 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 字段上使用 CAST
和 LEFT
函数,因为如果值不是消极的。似乎有更好的解决方案,可能是 TO_CHAR
。在 informix 数据库中,合并 dateime
和 nchar
字段以便输出时间正确的正确方法是什么?理想情况下,我想以非 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
我有一个 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 字段上使用 CAST
和 LEFT
函数,因为如果值不是消极的。似乎有更好的解决方案,可能是 TO_CHAR
。在 informix 数据库中,合并 dateime
和 nchar
字段以便输出时间正确的正确方法是什么?理想情况下,我想以非 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