У меня есть две отдельные колонки для часов и минут в моей таблице, и у меня есть отчет, в котором я должен вычесть 90 минут из общего времени вместе взятых или (1 час из поля часов) и 30 минут из поля минут. Вывод может быть в минутах или часах.

Я попытался "to_char ( hours_column -1,'00' ) || ':' || to_char ( minutes_column -30,'00' ) AS "MAX_TIME" " - это не удается, когда у меня есть время, например 9:00, я получаю 8: -30 в качестве вывода, когда мне нужно получить 7:30.

Я придумал некоторый sql-код с функциями DATEADD и cast, который работал, но он не работает, когда я внедряю его в Oracle.

Select Substring(Cast(DATEADD(minute, -90, Cast(hourscolumn + ':' + minutes column as Time)) as varchar(20)),1,5) as max_time

Может кто-нибудь помочь мне реализовать вышеупомянутый код в Oracle? Я просто пытаюсь вычесть 90 минут, сложив столбцы часов и минут.

0
sree 25 Июл 2019 в 23:31

2 ответа

Лучший ответ

Что-то вроде этого?

  • test CTE представляет ваши данные. Почему у вас появилась эта (плохая) идея? Кто / что мешает вам хранить 32 часа и 87 минут в этих столбцах?
  • сам запрос содержит
    • time: способ создания допустимого значения date. Он потерпит неудачу, если hours и / или minutes недопустимы (например, как упоминалось ранее 32:87)
    • subtracted: вычтите 90 минут из time; (24 * 60) представляет собой 24 часов в день, 60 минут в час. Он будет содержать как дату, так и время
    • окончательное result достигается применением to_char с соответствующей маской формата (hh24:mi) к значению subtracted

SQL> alter session set nls_Date_format = 'dd.mm.yyyy hh24:mi';

Session altered.

SQL> with test (hours, minutes) as
  2    (select '09', '00' from dual union all
  3     select '23', '30' from dual union all
  4     select '00', '20' from dual
  5    )
  6  select hours,
  7         minutes,
  8         to_date(hours||minutes, 'hh24mi') time,
  9         --
 10         to_date(hours||minutes, 'hh24mi') - 90 / (24 * 60) subtracted,
 11         --
 12         to_char(to_date(hours||minutes, 'hh24mi') - 90 / (24 * 60), 'hh24:mi') result
 13  from test;

HO MI TIME             SUBTRACTED       RESUL
-- -- ---------------- ---------------- -----
09 00 01.07.2019 09:00 01.07.2019 07:30 07:30
23 30 01.07.2019 23:30 01.07.2019 22:00 22:00
00 20 01.07.2019 00:20 30.06.2019 22:50 22:50

SQL>
1
Littlefoot 25 Июл 2019 в 20:45

Используйте NUMTODSINTERVAL для преобразования часов и минут в INTERVAL типы данных, а затем вы можете вычесть INTERVAL '90' MINUTE и EXTRACT полученные часовые и минутные компоненты.

Установка Oracle :

CREATE TABLE table_name ( hours_column, minutes_column ) AS
  SELECT  0,  0 FROM DUAL UNION ALL
  SELECT  1, 30 FROM DUAL UNION ALL
  SELECT  2, 45 FROM DUAL UNION ALL
  SELECT  3,  0 FROM DUAL UNION ALL
  SELECT 27, 59 FROM DUAL

Запрос :

SELECT EXTRACT( HOUR   FROM time ) + EXTRACT( DAY FROM time ) * 24 AS hours,
       EXTRACT( MINUTE FROM time ) AS minutes,
       time,
       TO_CHAR( EXTRACT( HOUR   FROM time ) + EXTRACT( DAY FROM time ) * 24, '00' )
       || ':' || TO_CHAR( ABS( EXTRACT( MINUTE FROM time ) ), 'FM00' ) AS as_string
FROM   (
  SELECT NUMTODSINTERVAL( hours_column, 'HOUR' )
         + NUMTODSINTERVAL( minutes_column, 'MINUTE' )
         - INTERVAL '90' MINUTE AS time
  FROM   table_name
)

Вывод :

HOURS | MINUTES | TIME                          | AS_STRING
----: | ------: | :---------------------------- | :--------
   -1 |     -30 | -000000000 01:30:00.000000000 | -01:30   
    0 |       0 | +000000000 00:00:00.000000000 |  00:00   
    1 |      15 | +000000000 01:15:00.000000000 |  01:15   
    1 |      30 | +000000000 01:30:00.000000000 |  01:30   
   26 |      29 | +000000001 02:29:00.000000000 |  26:29   

db <> fiddle здесь

1
MT0 25 Июл 2019 в 21:16