2014-01-14 4 views

ответ

1

EXTRACT работает на DateTime или выражение интервала значений. Когда вы вычитаете две даты, вы получаете число, которое является числом дней. Если вы хотите использовать извлечение , вы должны преобразовать его в формат интервала с использованием NUMTODSINTERVAL, а затем использовать ЭКСТРАКТ.

SELECT TO_DATE ('14-01-2014 14:00:00', 'dd-mm-yyyy hh24:mi:ss') 
     - TO_DATE ('13-01-2014 22:30:45', 'dd-mm-yyyy hh24:mi:ss') 
    FROM DUAL; 

0.6453125 

SELECT NUMTODSINTERVAL (
      TO_DATE ('14-01-2014 14:00:00', 'dd-mm-yyyy hh24:mi:ss') 
      - TO_DATE ('13-01-2014 22:30:45', 'dd-mm-yyyy hh24:mi:ss'), 
      'DAY') 
    FROM DUAL; 

+00 15:29:15.000000 

SELECT EXTRACT (HOUR FROM intrvl) 
     || ':' 
     || EXTRACT (MINUTE FROM intrvl) 
     || ':' 
     || EXTRACT (SECOND FROM intrvl) 
    FROM (SELECT NUMTODSINTERVAL (
        TO_DATE ('14-01-2014 14:00:00', 'dd-mm-yyyy hh24:mi:ss') 
        - TO_DATE ('13-01-2014 22:30:45', 'dd-mm-yyyy hh24:mi:ss'), 
        'DAY') 
        AS intrvl 
      FROM DUAL); 

15:29:15 

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

SELECT EXTRACT (HOUR FROM intrvl) 
     || ':' 
     || EXTRACT (MINUTE FROM intrvl) 
     || ':' 
     || EXTRACT (SECOND FROM intrvl) 
    FROM (SELECT CAST (
        TO_DATE ('14-01-2014 14:00:00', 'dd-mm-yyyy hh24:mi:ss') AS TIMESTAMP) 
       - CAST (
        TO_DATE ('13-01-2014 22:30:45', 'dd-mm-yyyy hh24:mi:ss') AS TIMESTAMP) 
        AS intrvl 
      FROM DUAL); 
Смежные вопросы