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

Как я могу корректно сравнить текущее время с диапазоном рабочих часов для каждой страны в базе данных Postgres? Моя попытка привести время к часовому поясу 'Европа/Киев' не работает. Как исправить запрос, чтобы учесть текущее время в указанном часовом поясе и сравнить его с диапазоном рабочих часов? Какие альтернативные операторы SQL можно использовать для выполнения такого сравнения времен?
  • 14 июня 2024 г. 15:12
Ответы на вопрос 2
Для проверки, входит ли определенная дата в указанный период времени, вы можете использовать следующий SQL запрос:

```sql
SELECT *
FROM your_table
WHERE your_date_column BETWEEN start_date AND end_date;
```

Где `your_table` - название вашей таблицы, `your_date_column` - столбец с датой, `start_date` и `end_date` - начальная и конечная даты периода времени.

Чтобы правильно сравнить текущее время с диапазоном рабочих часов для каждой страны, учитывая часовой пояс 'Европа/Киев', вы можете использовать функцию `AT TIME ZONE` для перевода времени в нужный часовой пояс. Например, запрос может выглядеть так:

```sql
SELECT *
FROM your_table
WHERE CURRENT_TIMESTAMP AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev' BETWEEN start_time AT TIME ZONE 'Europe/Kiev' AND end_time AT TIME ZONE 'Europe/Kiev';
```

Где `your_table` - название вашей таблицы, `start_time` и `end_time` - начальное и конечное время рабочих часов.

Альтернативные операторы SQL, которые можно использовать для сравнения времен, включают `BETWEEN`, `>=`, `<=`, `>`, `<`, `EXTRACT()` для извлечения часа из времени и другие функции для работы с датами и временем в PostgreSQL.

Надеюсь, эта информация поможет вам справиться с вашей задачей!
В итоге я написал такую страшную штуку: 

SELECT
  c.id,
  c.working_hours,
  (now() AT TIME ZONE 'Europe/Kiev')::time AS now_time,
  (CURRENT_DATE + c.working_hours[1]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev' AS start_time,
  (CURRENT_DATE + c.working_hours[2]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev' AS end_time,
  ((now() AT TIME ZONE 'UTC')::time BETWEEN 
    ((CURRENT_DATE + c.working_hours[1]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev')::time AND
    ((CURRENT_DATE + c.working_hours[2]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev')::time) AS is_within_working_hours
FROM
  public.countries c;


Работает. Но, наверное, это можно сделать как-то получше))
Похожие вопросы