У меня есть таблица Postgres с интервальными данными, например:
Я хотел бы создать представление, которое отображает значения, но всего за месяцы (поэтому правильные значения в моем случае будут: 0, 1, 1,5, 9, 12). Я пробовал использовать:
EXTRACT(MONTHS FROM "MyTable"."Interval"::INTERVAL)
Однако это дало неправильные результаты (0, 1, 1, 9, 0).
Есть ли другая функция, которая будет отображать ожидаемые значения?
Что ж, функция extract
извлекает подполя, такие как год или час, из значений даты/времени, а не общее время, которое вы хотите, но мы можем создать результат самостоятельно, как показано ниже:
postgres=# select * from month_table ;
month
------------
0 month
1 month
1.5 months
9 months
1 year
2 years
1.5 years
(7 rows)
postgres=# select
case when month ~ 'month' then regexp_replace(month,' month.*','')::numeric
when month ~ 'year' then regexp_replace(month,' year.*','')::numeric * 12 end as months
from
month_table;
months
--------
0
1
1.5
9
12
24
18.0
(7 rows)
Может и есть, но я проверил документ о функциях процесса time/date
, не нашел, и это единственный способ, который я могу сейчас придумать. Если вы беспокоитесь о пограничных случаях, просто внимательно проверьте свои данные и напишите идеальное регулярное выражение, которое может охватывать все ситуации. Удачи! :)
Спасибо, это отлично работает! Я просто немного подозрительно использую регулярное выражение. У меня есть внутреннее (может быть, не совсем логичное) чувство, что что-то может пойти не так для крайних случаев... но я думаю, что нет встроенного или более безопасного способа, не так ли?