Запрос в Postgres: выборка книг за последнюю неделю
Быстрый ответ
Вот SQL-запросы для получения записей, созданных за последние 7 дней. Необходимо заменить your_table
и created_at
на название вашей таблицы и атрибут с датой:
-- Для PostgreSQL:
SELECT * FROM your_table WHERE created_at > CURRENT_DATE – INTERVAL '7 days';
-- Вероятно, самый распространенный запрос для этой задачи.
-- Для MySQL:
SELECT * FROM your_table WHERE created_at > CURDATE() – INTERVAL 7 DAY;
-- Это такой же пример, только адаптированный для MySQL.
С помощью этих запросов вы сможете выбрать требуемые записи в зависимости от используемого диалекта SQL.
Учёт часовых поясов
Часовой пояс может влиять на определение "текущего" дня. С учетом этого можно использовать следующий запрос:
-- Корректировка времени в PostgreSQL с учетом часового пояса пользователя:
SELECT * FROM your_table WHERE created_at > (CURRENT_DATE AT TIME ZONE 'UTC' – INTERVAL '7 days');
Исключаем сегодняшний день из прошедшей недели
Если нужно исключить текущий день из диапазона, сделать это можно так:
-- PostgreSQL, без учета текущего дня:
SELECT * FROM your_table
WHERE created_at >= CURRENT_DATE – INTERVAL '7 days'
AND created_at < CURRENT_DATE;
С воскресенья по субботу: точные границы недели
В случае необходимости выбрать данные за полную календарную неделю, можно использовать следующий запрос:
-- В PostgreSQL, за последнюю полную неделю до воскресенья:
SELECT * FROM your_table
WHERE created_at BETWEEN date_trunc('week', CURRENT_DATE) – INTERVAL '7 days'
AND date_trunc('week', CURRENT_DATE) – INTERVAL '1 day';
В результате выполнения этого SQL-запроса вы получите записи за последнюю рабочую неделю, с воскресенья по субботу.
Визуализация
Вот примерная схема поиска прошедших 7 дней:
| День недели | Найдены записи? |
| ------------ | --------------- |
| Сегодня | 👣 |
| 1 день назад | 👣 |
| 2 дня назад | 👣 |
| 3 дня назад | 👣 |
| 4 дня назад | 👣 |
| 5 дней назад | 👣 |
| 6 дней назад | 👣 |
| 7 дней назад | ❌ |
И выполнение SQL-запроса, который может отыскать эти записи:
SELECT * FROM activity
WHERE date_column >= CURDATE() – INTERVAL 7 DAY;
Улучшение производительности и использование индексов
Для больших объемов данных индексы – это инструмент оптимизации запросов. В PostgreSQL вы можете создать индекс для улучшения производительности запросов:
-- Создание индекса для оптимизации запроса в PostgreSQL:
CREATE INDEX idx_date_only ON your_table ((created_at::date));
Соответственно, после создания индекса запросы к базе следует модифицировать, используя эти индексы.
Перевод на разные диалекты SQL
SQL Server и SQLite имеют свои особенности работы с датами, отличные от PostgreSQL и MySQL. Вот примеры аналогичных запросов для них:
-- Для SQL Server:
SELECT * FROM your_table WHERE created_at > GETDATE() – 7;
-- Для SQLite:
SELECT * FROM your_table WHERE created_at > datetime('now', '-7 days');
Улучшение читабельности: CTE (Общие табличные выражения)
CTE (Common Table Expressions) – это способ локального именования подзапроса. Они существенно облегчают чтение и понимание SQL-запросов:
-- Использование CTE для определения временных границ:
WITH LastWeek AS (
SELECT CURRENT_DATE – INTERVAL '7 days' AS StartDate,
CURRENT_DATE AS EndDate
)
SELECT * FROM your_table
JOIN LastWeek ON created_at BETWEEN LastWeek.StartDate AND LastWeek.EndDate;
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 12.7 Функции даты и времени — Официальная документация MySQL по функциям даты и времени.
- Создание таблицы дат или календаря в SQL Server – Особенности работы с датами в SQL Server.
- PostgreSQL: Документация: 16: 9.9. Функции и операторы даты/времени — Обзор функций и операций с датами и временем в PostgreSQL.
- Как возвратить только дату из типа данных DateTime в SQL Server – Stack Overflow — Примеры работы с датами в SQL Server.
- Функции даты и времени — Полнейшее руководство SQLite по работе с датами и временем.