Раздел две даты по месяцам - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно разделить диапазон между двумя датами, когда месяц даты окончания отличается от месяца даты начала, используя SQL в Oracle 11gXE. Например:


SELECT ATIVOID, OSID, DT_INI, DT_FIM  
  FROM V_MTBF
 WHERE ATIVOID IN ('12345TC','TCCS011701160001');


+------------------+-------------+-------------------+--------------------+
|     ATIVOID      |     OSID    |       DT_INI      |      DT_FIM        |
+------------------+-------------+-------------------+--------------------+
| 12345TC          |  1710201409 | 20/10/17 14:09:58 | 01/12/17 09:03:52  |
| TCCS011701160001 |  1710201112 | 20/10/17 11:12:42 | 30/11/17 16:23:13  |
+------------------+-------------+-------------------+--------------------+

Хотелось бы увидеть:

+------------------+------------+-------------------+-------------------+
|     ATIVOID      |    OSID    |      DT_INI       |      DT_FIM       |
+------------------+------------+-------------------+-------------------+
| 12345TC          | 1710201409 | 20/10/17 14:09:58 | 31/10/17 23:59:59 |
| 12345TC          | 1710201409 | 01/11/17 00:00:00 | 30/11/17 23:59:59 |
| 12345TC          | 1710201409 | 01/12/17 00:00:00 | 01/12/17 09:03:52 |
| TCCS011701160001 | 1710201112 | 20/10/17 11:12:42 | 31/10/17 23:59:59 |
| TCCS011701160001 | 1710201112 | 01/11/17 00:00:00 | 30/11/17 16:23:13 |
+------------------+------------+-------------------+-------------------+

Я ценю любую помощь.

1 Ответ

0 голосов
/ 08 ноября 2018

Попробуйте с ниже, Замените статические значения на имя столбца и таблицы.

      WITH TEMP_CTE(ATIVOID, OSID, DT_INI,DIF_M, LVL, DT_FIM)
AS
(SELECT '12345TC' AS , '1710201409' AS OSID, TO_DATE('20/10/17 14:09:00', 'DD/MM/YYYY HH24:MI:SS') AS DT_INI,
       ABS(EXTRACT(MONTH FROM TO_DATE('20/10/17 14:09:58', 'DD/MM/YYYY HH24:MI:SS'))-  EXTRACT(MONTH FROM TO_DATE('01/12/17 09:03:52', 'DD/MM/YYYY HH24:MI:SS'))) AS DIF_M,
        1,
        TO_DATE('01/12/17 09:03:52', 'DD-MM-YYYY HH24:MI:SS' ) AS DT_FIM
  FROM DUAL
  UNION ALL 
  SELECT ATIVOID, OSID, ADD_MONTHS(DT_INI, 1) AS DT_INI,
  DIF_M, LVL + 1, DT_FIM FROM TEMP_CTE WHERE LVL <= DIF_M
  )
SELECT ATIVOID, OSID,
CASE WHEN LVL = 1 THEN TO_CHAR(DT_INI, 'DD-MM-YYYY HH24:MI:SS') ELSE TO_CHAR(TRUNC(DT_INI, 'MM'), 'DD-MM-YYYY HH24:MI:SS') END AS DT_INI,
CASE WHEN LVL <= DIF_M THEN TO_CHAR(TRUNC(LAST_DAY(DT_INI) + 1) - 1/(24*60*60), 'DD-MM-YYYY HH24:MI:SS') ELSE TO_CHAR(DT_FIM, 'DD-MM-YYYY HH24:MI:SS') END AS DT_FIM FROM TEMP_CTE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...