Метка времени + Нумери c часов в Oracle SQL - PullRequest
1 голос
/ 01 апреля 2020

В моих таблицах ввода я пытаюсь добавить часы (NUMERI C) к отметке времени

time_of_Day
2020-10-01 22:15:00
2020-11-01 15:04:00

hours_to_add
3
4

Expected result
2020-10-02 01:15:00
2020-11-01 19:04:00

Я пробовал следующий метод, но получаю ошибку: неверный синтаксис ввода для типа интервал: " hours_to_add "

SELECT 
time_of_Day+ interval 'hours_to_add' hour 
from your_table;

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Вы можете просто сделать:

select time_of_Day + hours_to_add/24 from your_table;

Это дает результат date тип данных.

Если вы хотите интервальную арифметику (и иметь результат timestamp тип данных):

select time_of_day + hours_to_add * interval '1' hour from your_table

Демонстрация на DB Fiddle :

with t as (
    select timestamp '2020-10-01 22:15:00' time_of_Day , 3 hours_to_add from dual
    union all select timestamp '2020-11-01 15:04:00', 4 from dual
)
select 
    t.*,
    time_of_day + hours_to_add/24 as_date, 
    time_of_day + hours_to_add * interval '1' hour as_timestamp
from t
TIME_OF_DAY         | HOURS_TO_ADD | AS_DATE             | AS_TIMESTAMP       
:------------------ | -----------: | :------------------ | :------------------
2020-10-01 22:15:00 |            3 | 2020-10-02 01:15:00 | 2020-10-02 01:15:00
2020-11-01 15:04:00 |            4 | 2020-11-01 19:04:00 | 2020-11-01 19:04:00
1 голос
/ 01 апреля 2020

Тип данных TIMESTAMP является расширением типа данных DATE . Здесь хранятся значения года, месяца, дня, часа, минуты и секунды. Он также хранит дробных секунд , которые не сохраняются типом данных DATE.

Так что, если вы не хотите отображать дробные секунды, используйте маску правильного формата с помощью TO_CHAR для отображения что вы хотите.

Вот рабочая демонстрация:

with your_table as
(
  select timestamp '2020-10-01 22:15:00' time_of_Day , 3 hrs from dual
  union all 
  select timestamp '2020-11-01 15:04:00', 4 from dual
)
select time_of_day, 
       to_char(time_of_day + interval '1' hour * hrs, 'YYYY-MM-DD HH24:MI:SS') new_time 
from your_table;

TIME_OF_DAY                    NEW_TIME           
------------------------------ -------------------
01-10-20 10:15:00.000000000 PM 2020-10-02 01:15:00
01-11-20 3:04:00.000000000 PM  2020-11-01 19:04:00

В метке времени все еще будут храниться дробные секунды как 02-10-20 1:15:00.000000000 AM.

1 голос
/ 01 апреля 2020

Умножьте значение с фиксированным интервалом:

select time_of_day + interval '1' hour * hours_to_add
from the_table;

Демонстрационная версия

...