Дати й часлише PostgreSQL

DATE_BIN

Округлює момент часу вниз до початку інтервалу довільної довжини: 15 хвилин, 6 годин, 10 днів.

Синтаксис

DATE_BIN(INTERVAL '<крок>', <момент>, <точка відліку>)

Як DATE_TRUNC, але крок може бути будь-яким, а не лише годиною чи днем. Третій аргумент — точка відліку, від якої рахуються відрізки: з нею DATE_BIN(INTERVAL '15 minutes', …) дає 15:30, 15:45, 16:00. Найчастіше — щоб групувати події по 15 хвилин чи по змінах. З'явилася в PostgreSQL 14.

Дані для прикладів

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

До початку 15-хвилинки
SELECT DATE_BIN(INTERVAL '15 minutes', TIMESTAMP '2026-09-13 15:47', TIMESTAMP '2026-01-01') AS bin_start;
bin_start
2026-09-13 15:45:00
Замовлення по 12-годинних змінах
SELECT id, created_at,
DATE_BIN(INTERVAL '12 hours', created_at, TIMESTAMP '2026-01-01') AS shift_start
FROM orders;
idcreated_atshift_start
12026-07-03 10:15:002026-07-03 00:00:00
22026-07-28 18:40:002026-07-28 12:00:00
32026-08-09 09:05:002026-08-09 00:00:00
42026-08-21 14:30:002026-08-21 12:00:00
52026-09-02 11:00:002026-09-02 00:00:00
Точка відліку зсуває відрізки
SELECT DATE_BIN(INTERVAL '12 hours', TIMESTAMP '2026-09-13 10:15', TIMESTAMP '2026-01-01 08:00') AS shift_from_8;
shift_from_8
2026-09-13 08:00:00

Від відліку о 08:00 зміни починаються о 08:00 і 20:00, тож 10:15 належить до ранкової.

Зверни увагу

Крок не може містити місяці чи роки: DATE_BIN(INTERVAL '1 month', …) дасть помилку timestamps cannot be binned into intervals containing months or years. Для місяців — DATE_TRUNC('month', …).

Відрізки рахуються від точки відліку, а не від півночі. Для 15 хвилин підійде будь-яка «кругла» точка, а для 7 днів від неї залежить, з якого дня тижня почнеться відрізок.

Схожі функції