Смена даты в ячейке в зависимости от времени

Продолжая данный вопрос: Конвертирование строки с числом заданой длины в значение времени

В таблице содержатся 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 шт):

Автор решения: Mike

Нам необходимо вычислить разницу в часах между двумя временами. Скорректировать ее в случае если превышает 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

→ Ссылка