ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Запрос в Postgres: выборка книг за последнюю неделю

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Вот SQL-запросы для получения записей, созданных за последние 7 дней. Необходимо заменить your_table и created_at на название вашей таблицы и атрибут с датой:

SQL
Скопировать код
-- Для 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.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Учёт часовых поясов

Часовой пояс может влиять на определение "текущего" дня. С учетом этого можно использовать следующий запрос:

SQL
Скопировать код
-- Корректировка времени в PostgreSQL с учетом часового пояса пользователя:
SELECT * FROM your_table WHERE created_at > (CURRENT_DATE AT TIME ZONE 'UTC' – INTERVAL '7 days');

Исключаем сегодняшний день из прошедшей недели

Если нужно исключить текущий день из диапазона, сделать это можно так:

SQL
Скопировать код
-- PostgreSQL, без учета текущего дня:
SELECT * FROM your_table 
WHERE created_at >= CURRENT_DATE – INTERVAL '7 days' 
AND created_at < CURRENT_DATE;

С воскресенья по субботу: точные границы недели

В случае необходимости выбрать данные за полную календарную неделю, можно использовать следующий запрос:

SQL
Скопировать код
-- В 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 дней:

Markdown
Скопировать код
| День недели  | Найдены записи? |
| ------------ | --------------- |
| Сегодня      |       👣        |
| 1 день назад |       👣        |
| 2 дня назад  |       👣        |
| 3 дня назад  |       👣        |
| 4 дня назад  |       👣        |
| 5 дней назад |       👣        |
| 6 дней назад |       👣        |
| 7 дней назад |        ❌       |

И выполнение SQL-запроса, который может отыскать эти записи:

SQL
Скопировать код
SELECT * FROM activity
WHERE date_column >= CURDATE() – INTERVAL 7 DAY;

Улучшение производительности и использование индексов

Для больших объемов данных индексы – это инструмент оптимизации запросов. В PostgreSQL вы можете создать индекс для улучшения производительности запросов:

SQL
Скопировать код
-- Создание индекса для оптимизации запроса в PostgreSQL:
CREATE INDEX idx_date_only ON your_table ((created_at::date));

Соответственно, после создания индекса запросы к базе следует модифицировать, используя эти индексы.

Перевод на разные диалекты SQL

SQL Server и SQLite имеют свои особенности работы с датами, отличные от PostgreSQL и MySQL. Вот примеры аналогичных запросов для них:

SQL
Скопировать код
-- Для 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-запросов:

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;

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 12.7 Функции даты и времениОфициальная документация MySQL по функциям даты и времени.
  2. Создание таблицы дат или календаря в SQL Server – Особенности работы с датами в SQL Server.
  3. PostgreSQL: Документация: 16: 9.9. Функции и операторы даты/времени — Обзор функций и операций с датами и временем в PostgreSQL.
  4. Как возвратить только дату из типа данных DateTime в SQL Server – Stack Overflow — Примеры работы с датами в SQL Server.
  5. Функции даты и времени — Полнейшее руководство SQLite по работе с датами и временем.