Blog/content/posts/2023/sql/sqlite-datetime-now.md

64 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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).