继续这个问题: Converting a string with a number of given length to a time value
该表包含 6 列:
REG_ID
- 标识符DDATE
- 活动日期DTIME
- 4位数字格式的事件时间DTIMEUTC
- 4 位数字格式的 UTC 事件时间DT_LOCAL
- 转换(以正常形式)事件的日期和时间DT_UTC
- 以 UTC 转换(以正常形式)事件的日期和时间
输入前 4 列中的数据。在最后两列中,使用我在上一个问题中提示的查询输入数据:
UPDATE ATEST
SET DT_LOCAL = "DDATE" || ' ' || SUBSTR(DTIME, 1, 2)|| ':' ||substr(DTIME, 3, 2)
WHERE REG_ID > 0
UPDATE ATEST
SET DT_UTC = "DDATE" || ' ' || SUBSTR(DTIMEUTC, 1, 2)|| ':' ||substr(DTIMEUTC, 3, 2)
WHERE REG_ID > 0
最后,一个问题。从查询和表格中可以看出,有时 UTC 时间会落在第二天,因此日期应该会改变。也就是说,根据示例,表中带有 UTC 时间的第二行应该已经是 01/03/2010,而不是 01/02/2010。如果与 DTIME 相比,DTIMEUTC 已经移到下一天,那么应该执行什么 SQL 查询以使 DT_UTC 字符串中的日期递增?
在此示例中,DT_UTC 中的数据并不完全正确,例如,第 1 行和第 2 行应包含第一个数字,因为第二个数字尚未到达 UTC。时间在 12 小时内变化。
我正在附加一个查询来创建一个表:
create table ATEST
(
reg_id NUMBER(19) not null,
ddate VARCHAR2(255),
dtime VARCHAR2(255),
dt_local VARCHAR2(255),
dt_utc VARCHAR2(255),
dtimeutc VARCHAR2(255)
)
insert into ATEST (reg_id, ddate, dtime, dt_local, dt_utc, dtimeutc)
values (1, '02.01.2010', '0125', '02.01.2010 01:25', '02.01.2010 22:25', '2225');
insert into ATEST (reg_id, ddate, dtime, dt_local, dt_utc, dtimeutc)
values (2, '02.01.2010', '0328', '02.01.2010 03:28', '02.01.2010 20:28', '2028');
insert into ATEST (reg_id, ddate, dtime, dt_local, dt_utc, dtimeutc)
values (3, '03.01.2010', '0645', '03.01.2010 06:45', '03.01.2010 02:45', '0245');
insert into ATEST (reg_id, ddate, dtime, dt_local, dt_utc, dtimeutc)
values (4, '03.01.2010', '1250', '03.01.2010 12:50', '03.01.2010 09:50', '0950');
insert into ATEST (reg_id, ddate, dtime, dt_local, dt_utc, dtimeutc)
values (5, '03.01.2010', '1845', '03.01.2010 18:45', '03.01.2010 15:45', '1545');
commit;
我们需要计算两次之间的小时差。如果超过 12 小时,请在一天中的其余时间进行调整。然后从本地日期时间中减去以小时为单位的结果值,从而获得 UTC 日期时间。
在sqlfiddle.com计算新日期的示例