Поле интервала в Postgresql

В чем разница между этими командами?

ALTER TABLE podcast_episodes ADD COLUMN duration interval;

ALTER TABLE podcast_episodes ADD COLUMN duration interval SECOND(0);

ALTER TABLE podcast_episodes ADD COLUMN duration interval SECOND;

Я хотел бы сохранить продолжительность эпизода подкаста, а затем иметь podcast_playback_history с first_mark и last_mark для расчета процента от всего прослушанного эпизода.

Документы сказали

Тип интервала имеет дополнительную опцию, которая заключается в том, чтобы ограничить набор сохраняемых полей, написав одну из следующих фраз:

ГОД

МЕСЯЦ

ДЕНЬ

ЧАС

МИНУТА

ВТОРОЙ

ГОД В МЕСЯЦ

ДЕНЬ В ЧАС

ДЕНЬ ДО МИНУТЫ

ДЕНЬ ВТОРОЙ

ЧАС В МИНУТУ

ЧАС ДО СЕКУНДУ

МИНУТА ДО СЕКУНДЫ

Обратите внимание, что если указаны оба поля и p, поля должны включать SECOND, поскольку точность применяется только к секундам.

Есть ли дополнительная выгода, если я установлю его на секунду? Будет ли он по-прежнему 16 байт или будет меньше? Я пытался использовать второй и второй (0), когда я сохраняю строку, она по-прежнему отображается как «0 лет 0 месяцев 0 дней 0 часов 0 минут 2,00 секунды».


person nanakondor    schedule 18.04.2021    source источник


Ответы (1)


Добавленная спецификация fields определяет, как интерпретируются строки с непомеченными количествами.

Руководство:

При записи константы интервала со спецификацией полей или при назначении строки столбцу интервала, который был определен с помощью спецификации полей, интерпретация непомеченных величин зависит от полей. Например, INTERVAL '1' YEAR читается как 1 год, тогда как INTERVAL '1' означает 1 секунду.

Я никогда не использую эти модификаторы для определения типа. Лучше придерживайтесь интервалов по умолчанию и избегайте путаницы. Всегда указывайте имена количеств в строковых литералах (interval '13 seconds' или interval '13 sec'), никогда interval '13' - единственный случай, когда добавленный модификатор типа сработает. Я бы не хотел зависеть от определения таблицы для интерпретации моего ввода. Особенно для такой редко используемой функции.

Необязательный модификатор точности (0) .. (6) применяется только к секундам и разрешен только вместе с этой спецификацией поля. Руководство:

Обратите внимание: если указаны и fields, и p, поля должны содержать SECOND, поскольку точность применяется только к секунды.

Он определяет, сколько десятичных цифр хранится в долях секунды. Если вы используете его (чего я не стал бы), имейте в виду, что значения округляются, а не усекаются (как можно было бы ожидать).

test=> SELECT '13.555555 sec'::interval(3);
   interval   
--------------
 00:00:13.556    -- !
(1 row)

test=> SELECT '13.555555 sec'::interval(0);
 interval 
----------
 00:00:14        -- !!!
(1 row)

Демо:

db‹›fiddle здесь

Будет ли дополнительная выгода, если я установлю его на second?

Нет, это все равно по умолчанию. (И я настоятельно рекомендую придерживаться значения по умолчанию, чтобы избежать путаницы.)

Будет ли он по-прежнему 16 байт или будет меньше?

Размер значения interval всегда составляет 16 байт.

person Erwin Brandstetter    schedule 18.04.2021