Формат дат это наверное самое кошмарное, что придумало человечество.
- 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 — как-то преобразует и делает хорошо