Pentaho CDE, дизайнер отчетов запрос justify_interval из PostgreSQL

Когда я пытаюсь выполнить этот запрос select justify_interval('2000000 second'); в postgreSQL (pgAdmin) он отлично работал, у меня был такой результат: 23 дня 03:33:20, но когда я использовал его в дизайнере отчетов Pentaho или CDE в Пентахо, у меня был такой результат: 00 лет 00 месяцев 23 дня....., мой вопрос: есть какие-либо методы, чтобы получить тот же результат, как pgAdmin в Пентахо, я не хочу, чтобы поля с 0 Скриншот из PEntaho Report Designer

1 ответ

Решение

Вы можете преобразовать свое значение в строку в запросе SQL:

  1. Вы можете просто привести свое значение к тексту или varchar в SQL:

    select justify_interval('2000000 second')::text as justify_interval;
    

    или же

    select cast(justify_interval('2000000 second') AS text) as justify_interval
    

    Выход: 23 days 03:33:20

  2. Если вы хотите иметь больший контроль над результирующим значением, вы можете извлечь различные части интервала, используя date_part() или же extract() Функции SQL. Затем вы сможете отформатировать эти части по мере необходимости и добавить текст на требуемом языке:

    -- common table expression just to avoid writing justify_interval('2000000 second')
    -- in every date_part entry:
    WITH interval_cte(interval_column) AS (
        VALUES(justify_interval('2000000 second'))
    )
    SELECT
        -- trim to remove trailing space, if seconds are null
        -- nullif(*, 0) will make it null if the date part is 0
        -- in this case the subsequent concatenation with ' *(s)' will result in null too
        -- finally(*,''), coalesce will replace null with empty string, so that 
        -- subsequent concatenations will not dissappear:
        COALESCE(NULLIF(date_part('year', interval_column), 0) || ' year(s) ', '') 
        || COALESCE(NULLIF(date_part('month', interval_column), 0) || ' month(s) ', '') 
        || COALESCE(NULLIF(date_part('day', interval_column), 0) || ' day(s) ', '') 
        -- FM prefix will suppress leading whitespace,
        -- 00 will output leading zeros if number has less then two digits
        || to_char(date_part('hour', interval_column), 'FM00') || ':'
        || to_char(date_part('minute', interval_column), 'FM00') || ':'
        || to_char(date_part('second', interval_column), 'FM00') AS justofy_interval
    FROM interval_cte
    

Выход: 23 day(s) 03:33:20

Другие вопросы по тегам