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