Дата и время.md 2.7 KB

~={yellow}Форматирование даты и времени=~

--- Создаем таблицу с полем timestamp
create table log(
    log_id bigint generated always as identity,
    created_at timestamp not null default current_timestamp,
    message text not null
);

-- Добавляем данные
insert into log (message) values
	('Произошло страшное: сломался прием платежа'),
	('Трындец с отправкой почты, похоже, почтовый сервер недоступен!'),
	('Ужас, все работает!');

-- Забиарем данные в нужном формате timestamp
select to_char(created_at, 'DD.MM.YYYY HH24:MI:SS') as "дата инцидента", message as "сообщение" from log;

~={yellow}Правильная вставка timestamp с явным указанием формата=~

insert into log (created_at, message) values
    (to_timestamp('31.07.2024 20:19:51', 'DD.MM.YYYY HH24:MI:SS'), 'Произошло страшное: сломался приём платежа #1128'),
    (to_timestamp('31.07.2024 17:19:52', 'DD.MM.YYYY HH24:MI:SS'), 'Трындец с отправкой почты, похоже, почтовый сервер недоступен!'),
    (to_timestamp('31.07.2024 17:20:53', 'DD.MM.YYYY HH24:MI:SS'), 'Ужас, всё работает!');

Выборка данных только за текущей месяц

-- Хорошо заходит функция trunc
select * from log
where date_trunc('month', created_at)=date_trunc('month', current_timestamp)
order by log_id;

Выборка данных за последнюю неделю

select * from log
where created_at >= current_date - interval '7 days'
order by created_at;

Удалить данные из таблицы, добавленные более чем 30 дней назад.

delete from log
where created_at < current_date - interval '30 days';

Работа с интервалами. Прибавить месяц.

select '2024-01-31'::date + '1 month'::interval;

Форматированный вывод timestamp

select
    to_char(start, 'DD.MM.YYYY') start,
    to_char(finish, 'DD.MM.YYYY') finish,
    extract(days from finish - start) delta_in_days
from records
order by start, finish;

Примем использования age() - вывод дельты

select
    to_char(start, 'DD.MM.YYYY') start,
    to_char(finish, 'DD.MM.YYYY') finish,
    age(finish, start) delta
from records
order by start, finish;

Еще один пример выборки по дате

select email
from employees
where extract('month' from birthday)=4
order by email;