Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Минуты в часы  [new]
oracle_dev
Guest
Привет всем!
Допустим есть следующая функция

FUNCTION test(minutes INTEGER 
                               )                                                                         
                               return VARCHAR2  
IS
  rez VARCHAR2(6);
BEGIN
  SELECT SUBSTR(INTERVAL minutes MINUTE, 5, 5) INTO rez FROM dual;         
       
  RETURN rez;
END;    

Необходимо значение переменной minutes поместить в одинарные кавычки
13 мар 07, 22:40    [3894865]     Ответить | Цитировать Сообщить модератору
 Re: Минуты в часы  [new]
Форумчанин
Guest
Видимо так

FUNCTION test(minutes INTEGER 
                               )                                                                         
                               return VARCHAR2  
IS
  rez VARCHAR2(6);
BEGIN
  SELECT '''' || SUBSTR(INTERVAL minutes MINUTE, 5, 5) || '''' INTO rez FROM dual;         
       
  RETURN rez;
END; 
13 мар 07, 22:46    [3894877]     Ответить | Цитировать Сообщить модератору
 Re: Минуты в часы  [new]
oracle_dev
Guest
to Форумчанин
Так оно не скомпилится.

Если я бы написал конкретное значение вместо моей переменной:
SELECT SUBSTR(INTERVAL '800' MINUTE, 5, 5) INTO rez FROM dual;
то все прошло бы нормально.
13 мар 07, 22:55    [3894896]     Ответить | Цитировать Сообщить модератору
 Re: Минуты в часы  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
oracle_dev
Если я бы написал конкретное значение вместо моей переменной:
SELECT SUBSTR(INTERVAL '800' MINUTE, 5, 5) INTO rez FROM dual;
то все прошло бы нормально.

Вам буквосочетание "ЛИТЕРАЛ" о чем-нибудь говорит?

Ваша мечта может быть реализована так:
    execute immediate 'SELECT SUBSTR(INTERVAL '''|| minutes ||''' MINUTE, 5, 5) FROM dual' into rez;

но, честно говоря, совсем некрасиво и неэффективно.

Попробуйте лучше одним из PL/SQL способов:
    
    rez := to_char(trunc(sysdate)+minutes/1440,'hh24:mi');
    rez := to_char(mod(floor(minutes/60),24),'FM00')||':'||to_char(mod(minutes,60),'FM00');
    rez := to_char(floor(mod(minutes,1440)/60)+mod(minutes,60)/100,'FM00D00','NLS_NUMERIC_CHARACTERS='': ''');
13 мар 07, 23:31    [3894951]     Ответить | Цитировать Сообщить модератору
 Re: Минуты в часы  [new]
oracle_dev
Guest
andrey_anonymous, спасибо за разъяснения.
13 мар 07, 23:33    [3894955]     Ответить | Цитировать Сообщить модератору
 Re: Минуты в часы  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
oracle_dev
Привет всем!
Допустим есть следующая функция

FUNCTION test(minutes INTEGER 
                               )                                                                         
                               return VARCHAR2  
IS
  rez VARCHAR2(6);
BEGIN
  SELECT SUBSTR(INTERVAL minutes MINUTE, 5, 5) INTO rez FROM dual;         
       
  RETURN rez;
END;    

Необходимо значение переменной minutes поместить в одинарные кавычки


SQL> CREATE OR REPLACE
  2    FUNCTION f1(
  3                minutes INTEGER 
  4                )                                                 
  5    return VARCHAR2
  6    IS
  7        rez INTERVAL DAY TO SECOND;
  8    BEGIN
  9        rez := NUMTODSINTERVAL(minutes,'MINUTE');
 10        RETURN EXTRACT(HOUR FROM rez) || ':' || EXTRACT(MINUTE FROM rez);
 11  END;
 12  /

Function created.

SQL> set serveroutput on
SQL> exec dbms_output.put_line(f1(800))
13:20

PL/SQL procedure successfully completed.

SQL> 

SY.
14 мар 07, 00:28    [3895058]     Ответить | Цитировать Сообщить модератору
 Re: Минуты в часы  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
SY
  9        rez := NUMTODSINTERVAL(minutes,'MINUTE');
SY.

Я знал, что о чем-то забыл
14 мар 07, 00:31    [3895063]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить