Добавьте дни/часы/минуты и месяцы к отметке времени

#sql #oracle #plsql

Вопрос:

Есть ли способ добавить дни, часы, месяцы и минуты в метку времени, значение которой я хочу вставить в переменную

У меня есть отдельные переменные для минут,часов,дней и месяцев, которые я хочу добавить в метку времени

формат метки времени выглядит следующим образом: «04-ФЕВРАЛЯ-21 10.25.12.013000 УТРА».

Я попытался использовать SELECT TO_TIMESTAMP(дата создания, «дд-пн-гггг чч.ми.сс АМ») daysvar в duedate ИЗ dual; но он возвращает ошибку AM/AM или PM/PM требуется

daysvar содержит количество дней, которые должны быть добавлены к отметке времени

Спасибо!

Комментарии:

1. Что такое тип данных datecreated ? Вы говорите, что это временная метка. Но название подразумевает, что это а date . И вы говорите, что у него есть формат, который подразумевает, что это varchar2 date ни timestamp у одной из переменных нет формата.

2. Я использую varchar2 некоторое время, но позже буду использовать метку времени

3. Так что и то и другое datecreated и duedate должно быть varchar2 ?

Ответ №1:

У меня есть отдельные переменные для минут,часов,дней и месяцев, которые я хочу добавить в метку времени

Воспользуйся NUMTODSINTERVAL :

 DECLARE
  datecreated VARCHAR2(30) := '04-FEB-21 10.25.12.013000 AM';
  days    INT := 1;
  hours   INT := 2;
  minutes INT := 42;
  seconds INT := 3;
  duedate VARCHAR2(30);
BEGIN
  duedate := TO_CHAR(
               TO_TIMESTAMP(
                 datecreated,
                 'DD-MON-RR HH12.MI.SS.FF6 AM',
                 'NLS_DATE_LANGUAGE=American'
               )
                 NUMTODSINTERVAL(days,    'DAY')
                 NUMTODSINTERVAL(hours,   'HOUR')
                 NUMTODSINTERVAL(minutes, 'MINUTE')
                 NUMTODSINTERVAL(seconds, 'SECOND'),
               'DD-MON-RR HH12.MI.SS.FF6 AM',
               'NLS_DATE_LANGUAGE=American'
             );
  DBMS_OUTPUT.PUT_LINE(duedate);
END;
/
 

бд<>скрипка <>здесь


Если вы хотите добавить месяцы, то используйте ADD_MONTHS ; однако он возвращает a DATE (а не a TIMESTAMP ), поэтому вы потеряете доли секунды. Вы можете добавить их обратно, хотя:

 DECLARE
  datecreated VARCHAR2(30) := '04-FEB-21 10.25.12.013000 AM';
  months  INT := 4;
  days    INT := 1;
  hours   INT := 2;
  minutes INT := 42;
  seconds INT := 3;
  created_date TIMESTAMP;
  duedate VARCHAR2(30);
BEGIN
  created_date := TO_TIMESTAMP(
                    datecreated,
                    'DD-MON-RR HH12.MI.SS.FF6 AM',
                    'NLS_DATE_LANGUAGE=American'
                 );
  duedate := TO_CHAR(
               CAST(ADD_MONTHS(created_date, months) AS TIMESTAMP)
                 NUMTODSINTERVAL(days,    'DAY')
                 NUMTODSINTERVAL(hours,   'HOUR')
                 NUMTODSINTERVAL(minutes, 'MINUTE')
                 NUMTODSINTERVAL(seconds, 'SECOND')
                 (created_date - CAST(created_date AS DATE)), -- Fractional seconds
               'DD-MON-RR HH12.MI.SS.FF6 AM',
               'NLS_DATE_LANGUAGE=American'
             );
  DBMS_OUTPUT.PUT_LINE(duedate);
END;
/
 

бд<>скрипка <>здесь

Комментарии:

1. Можно ли здесь также использовать ADD_MONTHS?

2. @Kyujiin add_month можно использовать везде, где вы хотите, просто передайте значение даты или метки времени в качестве входных данных. Очевидно, что нет никакой разницы, какой временной интервал добавляется первым

3. @Kyujiin Да, вы можете, но это преобразует тип данных в a DATE , и вы потеряете доли секунды. Я обновил ответ, чтобы показать, как добавить месяцы, а затем преобразовать их обратно в a TIMESTAMP и восстановить дробные секунды.