Формат дат это наверное самое кошмарное, что придумало человечество.

  • yyyy-MM-dd HH:mm:ss.SSS (e.g. 2023-03-29 13:45:30.123)
  • yyyy/MM/dd HH:mm:ss (e.g. 2023/03/29 13:45:30)
  • MM/dd/yyyy HH:mm:ss (e.g. 03/29/2023 13:45:30)
  • dd.MM.yyyy HH:mm:ss (e.g. 29.03.2023 13:45:30)

Как можно забирать дату

WHERE date_part(‘month’, time) = 9 and date_part(‘year’, time) = 2022 — это например указываем Сентябрь

SELECT TRUNC(date_column, ‘DD’) AS truncated_date FROM your_table — а тут указываем нужный нам формат, то есть до времени и тд

или еще так date_trunc(‘week’, time) as sdaddas — здесь забираем неделю по столбцу с датой. Читается как дэйт транс

date(creation_time) as date — просто преобразовывает в дату | group by DATE(creation_time) — такая должна быть группировка

where date_part (‘dow’, creation_time) IN (6,7) — вот так по столбцу creation_time можно выбрать определенный дни недели!

GROUP BY user_id having max(time) < ‘2022-09-08’ — хитровыебанная конструкция

DATEDIFF(yy, user_actions.time, users.birth_date) - разница времени, понятно из запроса
DATE_PART('year', user_actions.time) - DATE_PART('year', users.birth_date) as user_age

Как агрегировать по месяцам, неделям и тд? при указанной дате до секунд

::decimal — что-то делает полезное

https://habr.com/ru/post/448072/

РАНЖИРУЮЩИЕ ФУНКЦИИ:

● ROW_NUMBER — простая нумерация (1, 2, 3, 4, 5)

● RANK — нумерация с учётом повторяющихся значений с пропуском рангов (1, 2, 2, 4, 5)

● DENSE_RANK — нумерация с учётом повторяющихся значений без пропуска рангов (1, 2, 2, 3, 4)

ФУНКЦИИ СМЕЩЕНИЯ:

● LAG / LEAD — значение предыдущей или следующей строки

● FIRST_VALUE / LAST_VALUE — первое или последнее значение в окне

Как разделять столбы в скл

SELECT SPLIT_PART(‘karpov.courses’, ‘.’, 2)

Результат:
courses

unnest — раскладывает список,

array_agg  — его собирает по какому-то значению

float — как-то преобразует и делает хорошо