# Функции даты и времени

## Получение данных {: #get_data }

### Поддерживаемые функции {: #supported_functions }

Поддержка SQL-функций получения даты и времени в Picodata показана в таблице ниже.

| Название функции          | Тип в PostgreSQL                  | Поддержка в Picodata | Тип в Picodata | Примечание                                                                |
|-------------------|----------------------------|--------------------|---------------|----------------------------------------------------------------------|
| `CURRENT_DATE`      | `DATE`                       | ⚠️                 | `datetime`      | возвращает несовместимый тип, вместо времени указаны нули                       |
| `CURRENT_TIME`      | `TIME WITH TIMEZONE`         | ❌                  |               |                                                                      |
| `CURRENT_TIMESTAMP` | `TIMESTAMP WITH TIMEZONE`    | ✅                  | `datetime`      |                                                                      |
| `LOCALTIME`         | `TIME WITHOUT TIMEZONE`      | ❌                  |               |                                                                      |
| `LOCALTIMESTAMP`    | `TIMESTAMP WITHOUT TIMEZONE` | ⚠️                 | `datetime`      | возвращает несовместимый тип, вывод соответствует `CURRENT_TIMESTAMP`|

✅ — полностью поддерживается<br>
⚠️ — поддерживается, но с отличиями от PostgreSQL<br>
❌ — не поддерживается

### CURRENT_DATE {: #current_date }

Функция `CURRENT_DATE` возвращает объект типа [DATETIME] с текущей
датой, временем `00:00:00` и часовым поясом. При этом, после позиции
времени указывается текущий часовой пояс.

!!! note "Примечание"
    Часовой пояс в выводе данной команды определяется настройками
    даты/времени хоста, на котором запущен инстанс Picodata, к которому, в
    свою очередь, подключена пользовательская сессия. Часовой пояс хоста
    можно посмотреть командами `date +%Z` или `timedatectl`.

#### Синтаксис {: #current_date_syntax }

![CURRENT_DATE](../../images/ebnf/current_date.svg)

#### Примеры {: #examples }

```sql
sql>  VALUES (CURRENT_DATE);
+--------------------------+
| COLUMN_1                 |
+==========================+
| 2025-09-23T00:00:00+0300 |
+--------------------------+
(1 rows)
```

### CURRENT_TIMESTAMP {: #current_timestamp }

Функция `CURRENT_TIMESTAMP` возвращает текущую дату, время и часовой
пояс аналогично функции `LOCALTIMESTAMP`.

### LOCALTIMESTAMP {: #localtimestamp }

Функция `LOCALTIMESTAMP` возвращает текущую дату и время, а также
значение часового пояса. Это возвратит значение `TIMESTAMP`.

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


!!! note "Примечание"
    Часовой пояс в выводе данной команды определяется настройками
    даты/времени хоста, на котором запущен инстанс Picodata, к которому, в
    свою очередь, подключена пользовательская сессия. Часовой пояс хоста
    можно посмотреть командами `date +%Z` или `timedatectl`.

#### Синтаксис {: #localtimestamp_syntax }

![LOCALTIMESTAMP](../../images/ebnf/localtimestamp.svg)

#### Примеры {: #localtimestamp_examples }

```sql title="Получение текущей даты и времени"
sql> SELECT localtimestamp;
+---------------------------------+
| col_1                           |
+=================================+
| 2025-09-23T17:30:53.900692+0300 |
+---------------------------------+
(1 rows)
```

```sql title="Получение текущей даты и времени с повышенной точностью"
sql> SELECT localtimestamp(3);
+------------------------------+
| col_1                        |
+==============================+
| 2025-09-24T16:54:55.691000+0300 |
+------------------------------+
(1 rows)
```

```sql title="Получение текущей даты и времени с максимальной точностью"
sql> SELECT localtimestamp(6);
+------------------------------+
| col_1                        |
+==============================+
| 2025-09-24T16:55:12.291324+0300 |
+------------------------------+
(1 rows)
```

## Преобразование данных {: #convert_data }

### TO_CHAR {: #to_char }

Функция `TO_CHAR` преобразует объект *expression* типа [DATETIME] в строку
типа [TEXT] согласно формату *format*.

Функция является [строгой].

Значение *format* должно соответствовать спецификации [strftime].

[TEXT]: ../sql_types.md#text
[DATETIME]: ../sql_types.md#datetime
[strftime]: https://man.freebsd.org/cgi/man.cgi?query=strftime
[строгой]: ../../overview/glossary.md#strict_function

#### Синтаксис {: #to_char_syntax }

![TO_CHAR](../../images/ebnf/to_char.svg)

#### Выражение {: #expression }

??? note "Диаграмма"
    ![Expression](../../images/ebnf/expression.svg)

#### Литерал {: #literal }

??? note "Диаграмма"
    ![Literal](../../images/ebnf/literal.svg)

#### Примеры {: #to_char_examples }

??? example "Тестовые таблицы"
    Примеры использования команд включают в себя запросы к [тестовым
    таблицам](../legend.md).

```sql title="Преобразование объектов DATETIME в строковые литералы заданного формата"
sql> SELECT to_char(since, 'In stock since: %d %b %Y') FROM orders;
+-------------------------------+
| COL_1                         |
+===============================+
| "In stock since: 13 Feb 2024" |
|-------------------------------|
| "In stock since: 29 Jan 2024" |
|-------------------------------|
| "In stock since: 11 Nov 2023" |
|-------------------------------|
| "In stock since: 11 May 2024" |
|-------------------------------|
| "In stock since: 01 Apr 2024" |
+-------------------------------+
(5 rows)
```

### TO_DATE {: #to_date }

Функция `TO_DATE` преобразует строку *expression* типа [TEXT] в объект
типа [DATETIME] согласно формату *format*.

Функция является [строгой].

Значение *format* должно соответствовать спецификации [strftime]. Если в
качестве *format* передана пустая строка `''`, используется формат `%F`,
он же `%Y-%m-%d`.

!!! note "Примечания"
    Функция `TO_DATE` всегда возвращает начало дня — `00:00:00`, даже если
    в строке *expression* указано время с точностью до секунд.

#### Синтаксис {: #to_date_syntax }

![TO_DATE](../../images/ebnf/to_date.svg)

#### Примеры {: #to_date_examples }

```sql title="Преобразование строковых литералов в объекты DATETIME"
sql> VALUES
    (to_date('2024-02-13 12:43:24', '%F')),
    (to_date('29.01.2024 15:41:22', '%d.%m.%Y')),
    (to_date('2023/11/11 13:01:56', '%Y/%m/%d')),
    (to_date('2024 05 11 18:59:01', '%Y %m %d')),
    (to_date('2024-04-01 00:00:01', ''));
+------------------------+
| COLUMN_5               |
+========================+
| "2024-02-13T00:00:00Z" |
|------------------------|
| "2024-01-29T00:00:00Z" |
|------------------------|
| "2023-11-11T00:00:00Z" |
|------------------------|
| "2024-05-11T00:00:00Z" |
|------------------------|
| "2024-04-01T00:00:00Z" |
+------------------------+
(5 rows)
```
