Смена даты в ячейке в зависимости от времени
Продолжая данный вопрос: Конвертирование строки с числом заданой длины в значение времени
В таблице содержатся 6 колонок:
REG_ID- идентификаторDDATE- дата событияDTIME- время события в формате 4 цифрDTIMEUTC- время события по UTC в формате 4 цифр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 уже должна быть 03.01.2010, а не 02.01.2010. Какой SQL запрос нужно сделать, чтобы дата в строке DT_UTC увеличивалась, если DTIMEUTC уже переходит на следующий день по сравнению с DTIME?
В данном примере данные в 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;
Ответы (1 шт):
Нам необходимо вычислить разницу в часах между двумя временами. Скорректировать ее в случае если превышает 12 часов, взяв оставшуюся часть суток. После чего вычесть полученное значение в часах из локальной даты-времени, получив таким образом дату-время UTC.
update atest
set dt_utc =
to_char(
to_date(dt_local, 'DD.MM.YYYY HH24:MI') - 1 / 24 *
case when abs((dtimeutc-dtime)/100) > 12
then (24 - abs((dtimeutc-dtime)/100)) * sign(dtimeutc-dtime)
else -(dtimeutc-dtime)/100
end
, 'DD.MM.YYYY HH24:MI')
Пример вычисления новой даты на sqlfiddle.com
