# Время и дата


## Работа с датой


В этой теме мы рассмотрим, как работать с датами в Postgres на примере таблицы **courses**.

| speciality | lessons | hours | starts | ends |
| --- | --- | --- | --- | --- |
| Сварщик | 30 | 90 | 01.02.23 | 01.08.23 |
| Электрик | 40 | 120 | 15.02.23 | 15.08.23 |
| Экскаваторщик | 25 | 80 | 25.03.23 | 25.09.23 |

### Формат даты

Чтобы отформатировать дату, используем функцию `TO_CHAR`.

#### dd.mm.yy

```sql
SELECT TO_CHAR(starts, 'dd.mm.yy') AS formatted_starts
FROM courses;
```

Результат:

| formatted_starts |
| --- |
| 01.02.23 |
| 15.02.23 |
| 25.03.23 |

#### dd.mm

```sql
SELECT TO_CHAR(starts, 'dd.mm') AS formatted_starts
FROM courses;
```

Результат:

| formatted_starts |
| --- |
| 01.02 |
| 15.02 |
| 25.03 |

#### dd.mm.yyyy

```sql
SELECT TO_CHAR(starts, 'dd.mm.yyyy') AS formatted_starts
FROM courses;
```

Результат:

| formatted_starts |
| --- |
| 01.02.2023 |
| 15.02.2023 |
| 25.03.2023 |

#### DD TMMonth — месяц прописью

```sql
SELECT TO_CHAR(starts, 'DD TMMonth') AS formatted_starts
FROM courses;
```

Результат:

| formatted_starts |
| --- |
| 01 Февраля |
| 15 Февраля |
| 25 Марта |

#### DD TMMonth, FMDay — месяц и день недели

```sql
SELECT TO_CHAR(starts, 'DD TMMonth, FMDay') AS formatted_starts
FROM courses;
```

Результат:

| formatted_starts |
| --- |
| 01 Февраля, Среда |
| 15 Февраля, Среда |
| 25 Марта, Суббота |

### Поиск по дате

Дата раньше:

```sql
SELECT * FROM courses WHERE starts
```

Результат:

| speciality | lessons | hours | starts | ends |
| --- | --- | --- | --- | --- |
| Сварщик | 30 | 90 | 01.02.23 | 01.08.23 |
| Электрик | 40 | 120 | 15.02.23 | 15.08.23 |

Дата позже:

```sql
SELECT * FROM courses WHERE starts > '2023-03-01';
```

Результат:

| speciality | lessons | hours | starts | ends |
| --- | --- | --- | --- | --- |
| Экскаваторщик | 25 | 80 | 25.03.23 | 25.09.23 |

Дата в интервале:

```sql
SELECT * FROM courses WHERE starts BETWEEN '2023-02-01' AND '2023-03-01';
```

Результат:

| speciality | lessons | hours | starts | ends |
| --- | --- | --- | --- | --- |
| Сварщик | 30 | 90 | 01.02.23 | 01.08.23 |
| Электрик | 40 | 120 | 15.02.23 | 15.08.23 |

### Сортировка

Сортировка по дате начала:

```sql
SELECT * FROM courses ORDER BY starts;
```

Результат:

| speciality | lessons | hours | starts | ends |
| --- | --- | --- | --- | --- |
| Сварщик | 30 | 90 | 01.02.23 | 01.08.23 |
| Электрик | 40 | 120 | 15.02.23 | 15.08.23 |
| Экскаваторщик | 25 | 80 | 25.03.23 | 25.09.23 |

## День, месяц, год ⚡️


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

**reservations**

| start | end | guest | price | room_id | status |
| --- | --- | --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | 500 | 202 | confirmed |
| 2023-04-06 | 2023-04-20 | Bob | 600 | 404 | pending |
| 2023-04-11 | 2023-04-12 | Charlie | 700 | 501 | cancelled |

Извлеките информацию из даты начала бронирования и выведите результаты с указанием номера комнаты и следующими столбцами: `day` (день), `month` (месяц), `year` (год). Для этого используйте функции SQL для работы с датой. Сортировка не требуется.

## Начало в понятном формате ⚡️


В этом задании мы будем работать с таблицей, содержащей информацию о бронированиях. Каждая запись в таблице представляет одно бронирование с указанием даты начала и конца, имени гостя, суммой оплаты, идентификатором комнаты и статусом бронирования (подтверждено, ожидается, отменено).

**reservations**

| start | end | guest | status |
| --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | confirmed |
| 2023-04-06 | 2023-04-20 | Bob | pending |
| 2023-04-11 | 2023-04-12 | Charlie | cancelled |

Необходимо вывести дату начала бронирования в формате `DD MMonth 2009`. Используйте функции для форматирования даты, такие как `TO_CHAR`

## День начала бронирования ⚡️


Выведите день недели начала бронирования для каждой записи. Дни должны быть отображены в формате, например, "Tuesday".

**reservations**

| start | end | guest | status |
| --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | confirmed |
| 2023-04-06 | 2023-04-20 | Bob | pending |
| 2023-04-11 | 2023-04-12 | Charlie | cancelled |

Вам не требуется сортировка данных. Выведите колонки с названиями `start_day`. Подсказка: используйте операторы для работы с датой и функцией для возврата названия дня недели в формате текста. Если необходимо, вы можете рассмотреть локализацию для отображения дней недели на русском языке.

## Вывести бронирования после 1 мая ⚡️


В этом задании мы работаем с базой данных бронирований комнат в отелях. Нас интересует информация о бронированиях, которые начинаются после 1 мая.

**reservations**

| start | end | guest | room_id |
| --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | 202 |
| 2023-04-06 | 2023-04-20 | Bob | 404 |
| 2023-04-11 | 2023-04-12 | Charlie | 501 |

## Вывести бронирования в субботу и воскресенье ⚡️


Выведите бронирования, которые начинаются в субботу или воскресенье.

**reservations**

| starts | ends | guest | room_id |
| --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | 202 |
| 2023-04-06 | 2023-04-20 | Bob | 404 |
| 2023-04-11 | 2023-04-12 | Charlie | 501 |

Ваша задача — вывести идентификатор комнаты, дату начала бронирования и день недели начала бронирования. Назовите колонки в выходной таблице как `room_id`, `day` и `weekday`. Для решения используйте функцию для работы с датами `TO_CHAR`, чтобы получить день недели.

Сортировка не требуется.

## Бронирования в первую половину месяца⚡️


В этом задании нас интересуют только бронирования, которые начинаются в первую половину месяца (с 1 по 15 число).

**reservations**

| starts | ends | guest | room_id |
| --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | 202 |
| 2023-04-06 | 2023-04-20 | Bob | 404 |
| 2023-04-11 | 2023-04-12 | Charlie | 501 |

## Подтвержденные бронирования апреля ⚡️


Выведите список подтвержденных (confirmed) бронирований, которые начались в апреле 2023 года. Бронирование имеет статус: подтверждено (confirmed), ожидает подтверждения (pending) или отменено (cancelled).

**reservations**

| start | end | guest | status | room_id |
| --- | --- | --- | --- | --- |
| 2023-04-06 | 2023-04-09 | Alex | confirmed |  |
| 2023-04-06 | 2023-04-20 | Bob | pending |  |
| 2023-04-11 | 2023-04-12 | Charlie | cancelled |  |

## Начинаются в нужный день ⚡️


В данном задании мы работаем с бронированиями, связанными с комнатами отеля. Каждое бронирование имеет информацию о клиенте, дате начала и окончания проживания, а также о номере комнаты.

Выведите информацию о бронированиях, которые начинаются 6 апреля. В ответе предоставьте следующие колонки: `room`, `guest`, `starts`, `ends`. Сортировка не требуется.

**reservations**

| starts | ends | guest | room_id | status |
| --- | --- | --- | --- | --- |
| 2023-06-02 | 2023-06-12 | Mallory | 501 | confirmed |
| 2023-06-11 | 2023-06-22 | Oscar | 201 | pending |
| 2023-06-03 | 2023-06-24 | Peggy | 202 | confirmed |

## Последние 3 бронирования ⚡️


Выведите 3 бронирования с самой поздней датой начала — последние по `starts`.

**reservations**

| starts | ends | guest | room_id | status |
| --- | --- | --- | --- | --- |
| 2023-06-02 | 2023-06-12 | Mallory | 501 | confirmed |
| 2023-06-11 | 2023-06-22 | Oscar | 201 | pending |
| 2023-06-03 | 2023-06-24 | Peggy | 202 | confirmed |

## Бронирования начинаются в июне ⚡️


В этом задании мы работаем с таблицей бронирований отелей. Нам нужно вывести все бронирования, которые начинаются в июне. Бронирования имеют статус, цену и информацию о госте, проживающем в комнате.

**reservations**

| starts | ends | guest | room_id | status |
| --- | --- | --- | --- | --- |
| 2023-06-02 | 2023-06-12 | Mallory | 501 | confirmed |
| 2023-06-11 | 2023-06-22 | Oscar | 201 | pending |
| 2023-06-03 | 2023-06-24 | Peggy | 202 | confirmed |
