Как взять разницу между двумя датами, указанными как год с кварталом - PullRequest
0 голосов
/ 30 августа 2018

Я не могу найти результат разницы между двумя датами, моя крепость 'YYYY-Q'

select MAX(t.period), MIN(t.period) from table t

и я хочу поставить также столбец MAX (t.period) -MIN (t.period). Когда я пытаюсь преобразовать его из даты в символ, у меня возникают проблемы (неправильный номер ORA-01722)

select MAX(t.period), MIN(t.period) to_char(MAX(t.period), 'YYYY-Q') from table t 

когда я пытаюсь поставить to_date, у меня тоже возникают проблемы (ORA-01820: код формата не может отображаться в формате ввода даты)

select MAX(t.period), MIN(t.period) to_date(MAX(t.period), 'YYYY-Q') from table t

Я просто хочу провести различие между двумя датами и не могу сделать одиночные выпуски ... Мой формат столбца периода такой же, как формат, который я поставил 'YYYY-Q', и если у меня есть, например, дата 2005-4 - 2004-2 дата, я хочу получить 6 результатов, это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы можете делать арифметику в пространстве «четвертей», а не дат (или месяцев).

Итак, переведите период в число четвертей. Например, 2000-1 можно преобразовать в 2000 * 4 + 1 = 80001. Разница этих чисел в том, что вы хотите.

Итак:

select ( ( substr(max(period), 1, 4) * 4 + substr(max(period), -1) ) - 
         ( substr(min(period), 1, 4) * 4 + substr(min(period), -1) )
       ) as diff_q

Обратите внимание, что при этом используется неявное преобразование, что должно быть хорошо, если все ваши значения действительно соответствуют этому формату.

0 голосов
/ 30 августа 2018

Вы можете преобразовать компонент лет вашего периода в начало года, используя:

TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' )

Затем вы можете добавить 3 месяца для каждого квартала после первого использования:

ADD_MONTHS(
  TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' ),
  3 * ( SUBSTR( period, 6, 1 ) - 1 )
)

Затем вы можете использовать MONTHS_BETWEEN, чтобы найти разницу между датами, и разделить на 3, чтобы получить разницу в количестве кварталов.

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;

Запрос 1 :

SELECT MIN( period ) || ' - ' || MAX( period ) AS range,
       MONTHS_BETWEEN( MAX( period_start ), MIN( period_start ) ) / 3
         AS quarters_difference
FROM   (
  SELECT period,
         ADD_MONTHS(
           TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' ),
           3 * ( SUBSTR( period, 6, 1 ) - 1 )
         ) period_start
  FROM   table_name
)

Результаты

|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...