---
title: "⏱ DATETIME 'now' по локальному времени в SQLite"
date: 2023-01-23T22:50:05+03:00
draft: false
tags: [sql, tips]
---

## DATETIME в SQLite

В базах данных часто используется дефолтные значения,
которые подставляются автоматически, если в операции `INSERT`
значение не указано.

Например у тебя есть таблица, в которой поле `join_date`
имеет тип данных `DATETIME`, значение по умолчанию которого `DATETIME('now')`.

```sql
CREATE TABLE IF NOT EXISTS users(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_name TEXT NOT NULL,
    join_date DATETIME NOT NULL DEFAULT ( DATETIME('now' ) )
);
```

В случает добавления записи в таблицу в поле `join_date`
автоматически будет подставлено текущее время.

В документации SQLite написано, что функция `datetime()` возращает значение
в виде текста в формате `ГГГГ-ММ-ДД ЧЧ:ММ:СС`.

> The `datetime()` function returns the date and time as text in their same formats: YYYY-MM-DD HH:MM:SS.

Значения даты и времени могут быть сохранены в трех форматах:

* текст в подмножестве формата ISO-8601
* числа представляющие Юлианский день
* числа представляющие количество секунд с момента (или до) 1970-01-01 00:00:00 UTC (временная метка unix).

Время во всех форматах представляется в UTC.

## Модификаторы

Функция `datetime()` имеет следующий синтаксис.

```c++
datetime(value, modifier)
```

В данном случает в качетсве значения (`value`) используется `now`.  
Список всех значений можно посмотреть на сайте SQLite:
[https://www.sqlite.org/lang_datefunc.html#time_values](https://www.sqlite.org/lang_datefunc.html#time_values).

Для того, чтобы функция вставляла в запись значение даты,
которое соответсвует локальному времени, необходим модификатор `localtime`.

```sql
CREATE TABLE IF NOT EXISTS users(
    join_date DATETIME NOT NULL DEFAULT ( DATETIME('now', 'localtime') )
);
```

Список всех модификаторах доступен по этой ссылке:
[https://www.sqlite.org/lang_datefunc.html#modifiers](https://www.sqlite.org/lang_datefunc.html#modifiers).
