Текущая ДАТА и ВРЕМЯ при добавлении записи в таблицу — efim360.ru
PostgreSQL
Как автоматически проставлять текущую ДАТУ и ВРЕМЯ при добавлении записи в таблицу?
Давайте начнём с того какие вообще типы данных для ДАТЫ и ВРЕМЕНИ существуют:
Типы даты и времени в СУБД PostgreSQL 2022 год
PostgreSQL предлагает нам основные 6 вариантов.
- timestamp without time zone
- timestamp with time zone
- date
- time without time zone
- time with time zone
- interval
Все эти варианты могут быть ещё и в виде массивов:
- timestamp without time zone []
- timestamp with time zone []
- date []
- time without time zone []
- time with time zone []
- interval []
А ещё все эти варианты могут иметь точность значений. Можно урезать точность вычислений при помощи круглых скобок.
Давайте для примера создадим таблицу и запихнём в неё все базовые вариации:
— Table: a. t_2
— DROP TABLE IF EXISTS a.t_2;
CREATE TABLE IF NOT EXISTS a.t_2
(
dt1 timestamp without time zone,
dt2 timestamp with time zone,
dt3 date,
dt4 time without time zone,
dt5 time with time zone,
dt6 interval
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS a.t_2
OWNER to postgres;
Вот так это может выглядеть в таблице.
Таблица с типами ДАТЫ и ВРЕМЕНИ в интерфейсе pgAdmin — 2022 год
Если в таком виде оставим, то ничего толкового не получится. Нужен ещё столбец c первичными ключами и данными. Добавим их.
Таблица с типами ДАТЫ и ВРЕМЕНИ в интерфейсе pgAdmin — добавили первичный ключ и данные — 2022 год
Ввод данных
Первичный ключ у нас оформлен автоинкрементом, а данные мы добавляем вручную.
Накинем одну запись в таблицу.
Добавили запись в таблицу где типы даты и времени могут быть null — PostgreSQLИ мы видим, что ни одна дата не проставилась автоматически при вставке данных записи в таблицу PostgreSQL. Что делать?
Решение
Чтобы ДАТЫ и ВРЕМЕНА проставлялись автоматически, нужно задать значения в поле DEFAULT
В таблице не заполнено поле DEFAULT для типов ВРЕМЕНИ и ДАТЫ — автоматически НЕ проставляется — PostgreSQL
Какие значения нужно задавать?
PostgreSQL предоставляет набор функций, результат которых зависит от текущей ДАТЫ и ВРЕМЕНИ. Все следующие функции соответствуют стандарту SQL и возвращают значения, отражающие время начала текущей транзакции:
- CURRENT_DATE
- CURRENT_TIME
- CURRENT_TIMESTAMP
- CURRENT_TIME(точность)
- CURRENT_TIMESTAMP(точность)
- LOCALTIME
- LOCALTIMESTAMP
- LOCALTIME(точность)
- LOCALTIMESTAMP(точность)
Давайте подпихнём нужные варианты ФУНКЦИИ в нужные ДЕФОЛТЫ таблицы
Добавили функции к нужным типам данных даты и времени в PostgreSQL
А теперь нужно добавить новую запись
Добавили запись в таблицу где типы даты и времени имеют дефолтные функции — PostgreSQLИ вот в добавленной записи автоматически проставились значения ДАТ и ВРЕМЁН. Теперь нам не нужно париться по высчитыванию дат.
Теперь мы точно будем знать когда запись была добавлена в таблицу.
Конечно же это самый «мизер» о датах и временах, но мы успешно решили нашу маленькую задачу.
Итоговый код таблицы:
Итоговый SQL-код таблицы с ДАТАМИ и ВРЕМЕНАМИ — PostgreSQL
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Раздел «8.5. Типы даты/времени» — https://postgrespro.ru/docs/postgresql/14/datatype-datetime
Раздел «9.9.5. Текущая дата/время» — https://postgrespro.ru/docs/postgresql/14/functions-datetime#FUNCTIONS-DATETIME-CURRENT
PostgreSQL | Типы данных
Последнее обновление: 17.03.2018
При определении таблицы для всех ее столбцов необходимо указать тип данных. Тип данных определяет диапазон значений, которые могут храниться в столбце, сколько они будут занимать места в памяти.
PostgreSQL поддерживает богатую палитру различных типов данных, среди которые условно можно разделить на подгруппы: числовые, символьные, логические, дата и время, бинарные и ряд других.Числовые типы данных
serial: представляет автоинкрементирующееся числовое значение, которое занимает 4 байта и может хранить числа от 1 до 2147483647. Значение данного типа образуется путем автоинкремента значения предыдущей строки. Поэтому, как правило, данный тип используется для определения идентификаторов строки.
smallserial: представляет автоинкрементирующееся числовое значение, которое занимает 2 байта и может хранить числа от 1 до 32767. Аналог типа
serial
для небольших чисел.bigserial: представляет автоинкрементирующееся числовое значение, которое занимает 8 байт и может хранить числа от 1 до 9223372036854775807. Аналог типа
serial
smallint: хранит числа от -32768 до +32767. Занимает 2 байта. Имеет псевдоним int2.
integer: хранит числа от -2147483648 до +2147483647. Занимает 4 байта. Имеет псевдонимы int и int4.
bigint: хранит числа от -9223372036854775808 до +9223372036854775807. Занимает 8 байт. Имеет псевдоним int8.
numeric: хранит числа с фиксированной точностью, которые могут иметь до 131072 знаков в целой части и до 16383 знаков после запятой.
Данный тип может принимать два параметра precision и scale:
numeric(precision, scale)
.Параметр
precision
указывает на максимальное количество цифр, которые может хранить число.Параметр
scale
представляет максимальное количество цифр, которые может содержать число после запятой. Это значение должно находиться в диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0.Например, для числа
23.5141
precision равно 6, а scale — 4.decimal: хранит числа с фиксированной точностью, которые могут иметь до 131072 знаков в целой части и до 16383 знаков в дробной части. То же самое, что и
numeric
.real: хранит числа с плавающей точкой из диапазона от 1E-37 до 1E+37. Занимает 4 байта. Имеет псевдоним
float4
.double precision: хранит числа с плавающей точкой из диапазона от 1E-307 до 1E+308. Занимает 8 байт. Имеет псевдоним
float8
.
Примеры использования:
Id SERIAL, TotalWeight NUMERIC(9,2), Age INTEGER, Surplus REAL
Типы для работы с валютой (денежными единицами)
Для работы с денежными единицами определен тип money, который может принимать значения в диапазоне от -92233720368547758.08 до +92233720368547758.07 и занимает 8 байт.
Символьные типы
character(n): представляет строку из фиксированного количества символов. С помощью параметра задается задается количество символов в строке. Имеет псевдоним char(n).
character varying(n): представляет строку из переменной длины. С помощью параметра задается задается максимальное количество символов в строке. Имеет псевдоним varchar(n).
text: представляет текст произвольной длины.
Бинарные данные
Для хранения бинарных данных определен тип bytea. Он хранит данные в виде бинарных строк, которые представляют последовательность октетов или байт.
Типы для работы с датами и временем
timestamp: хранит дату и время. Занимает 8 байт. Для дат самое нижнее значение — 4713 г до н.э., самое верхнее значение — 294276 г н.э.
timestamp with time zone: то же самое, что и
timestamp
, только добавляет данные о часовом поясе.-
date: представляет дату от 4713 г. до н.э. до 5874897 г н.э. Занимает 4 байта.
time: хранит время с точностью до 1 микросекунды без указания часового пояса. Принимает значения от 00:00:00 до 24:00:00. Занимает 8 байт.
time with time zone: хранит время с точностью до 1 микросекунды с указанием часового пояса. Принимает значения от 00:00:00+1459 до 24:00:00-1459. Занимает 12 байт.
interval: представляет временной интервал. Занимает 16 байт.
Распространенные форматы дат:
yyyy-mm-dd
—1999-01-08
Month dd, yyyy
—January 8, 1999
mm/dd/yyyy
—1/8/1999
Распространенные форматы времени:
Логический тип
Тип boolean может хранить одно из двух значений: true или false.
Вместо true
можно указывать следующие значения: TRUE, ‘t’, ‘true’, ‘y’, ‘yes’, ‘on’, ‘1’.
Вместо false
можно указывать следующие значения: FALSE, ‘f’, ‘false’, ‘n’, ‘no’, ‘off’, ‘0’.
Типы для представления интернет-адресов
cidr: интернет-адрес в формате IPv4 и IPv6. Например,
. Занимает от 7 до 19 байт.inet: интернет-адрес в формате
cidr/y
, гдеcidr
это адрес в формате IPv4 или IPv6, а/y
— количество бит в адресе (если этот параметр не указан, то используется 34 для IPv4, 128 для IPv6). Например,192.168.0.1/24
или2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128
. Занимает от 7 до 19 байт.macaddr: хранит MAC-адрес. Занимает 6 байт.
macaddr8: хранит MAC-адрес в формате EUI-64. Занимает 8 байт.
Геометрические типы
point: представляет точку на плоскости в формате
(x,y)
. Занимает 16 байт.line: представляет линию неопределенной длины в формате
{A,B,C}
. Занимает 32 байта.lseg: представляет отрезок в формате
((x1,y1),(x2,y2))
. Занимает 32 байта.box: представляет прямоугольник в формате
((x1,y1),(x2,y2))
. Занимает 32 байта.path: представляет набор содиненных точек. В формате
((x1,y1),...)
путь является закрытым (первая и последняя точка соединяются линией) и фактически представляет многоугольник. В формате[(x1,y1),...]
путь является открытым Занимает 16+16n байт.polygon: представляет многоугольник в формате
((x1,y1),...)
. Занимает 40+16n байт.circle: представляет окружность в формате
<(x,y),r>
. Занимает 24 байта.
Остальные типы данных
json: хранит данные json в текстовом виде.
jsonb: хранит данные json в бинарном формате.
uuid: хранит универсальный уникальный идентификатор (UUID), например,
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
. Занимает 32 байта.xml: хранит даные в формате XML.
НазадСодержаниеВперед
Улучшенная обработка дат в запросах PostgreSQL
Деррик Карр
- постгрес
- SQL
- данные
- сеть
Иногда нам нужна функциональность, недоступная для нашего API ORM. Когда это
бывает, мы пишем старый добрый SQL. Это компромисс. Мы отказываемся от удобной даты и
вспомогательные методы времени (например, 1.month.ago
) в обмен на добавленный запрос
гибкость. К счастью, Postgres предоставляет несколько приемов для
сделать работу с датами более плавной. Два из них, которые я считаю наиболее полезными, это тип данных interval
и функция date_trunc
.
Тип данных interval
позволяет нам писать наш SQL
запросы таким образом, который отражает то, как мы их произносим. На веб-стороне Rails дает
us 30.days.ago
; на стороне базы данных Postgres дает нам интервал '30 дней
назад'
.
Интервалы нельзя использовать в качестве меток времени, но их можно добавлять и вычитать из. Ниже мы вычитаем 30 дней из текущего времени, чтобы получить список пользователей, созданных за последние 30 дней.
ВЫБОР * ОТ пользователей ГДЕ created_at <= now() - интервал '30 дней'
Практический пример использования
Тип интервала
светится, когда есть операции с относительным временем. Его можно использовать с большинством отчетов, основанных на времени, в приложении. Это будет
быть полезным задолго до того, как вы развернете свой собственный пакет аналитики. Я видел это
используется для переноса метрики North Star в таблицу и для создания пользовательских
создание отчетов с помощью Scenic.
Давайте представим, что мы проводим исследование по разработке продукта и хотим опросить пользователей, которые купили что-то через наше приложение электронной коммерции в течение 90 дней регистрации. Мы можем использовать интервал, чтобы легко найти нужных пользователей.
ВЫБЕРИТЕ * ОТ пользователей ПРИСОЕДИНЯЙТЕСЬ к покупкам ON user_id = users.id ГДЕ Purchases.created_at - users.created < interval '90 days';
Пример простой, но он показывает, что интервал
может помочь вам писать чище
запросы на основе даты и времени, даже если запросы становятся более сложными.
Функция date_trunc
позволяет указать точность даты. Это
отбрасывает значения ниже нашей целевой точности, поэтому, если мы хотим указать временную метку
к день
, затем все остальные поля до секунд
обнуляются
в возвращаемом значении.
Фрагмент ниже возвращает набор дней, когда новые записи были созданы в произвольная_таблица
.
SELECT DISTINCT ON (созданный_в) date_trunc('день', созданный_в) КАК созданный_в ИЗ произвольной_таблицы ГДЕ created_at> '2016-09-01' ORDER BY created_on DESC;
Функция date_trunc
допускает значения, которые не являются очевидными частями меток времени,
нравится неделя
и квартал
. Полный список доступен в
Постгрес документы.
Оба интервала
и date_trunc
помогли мне написать более эффективные SQL-запросы
и ответьте на острые вопросы о данных приложения. Иди вперед и пиши бесстрашный
(только для чтения) SQL!
Функции даты и времени — Справочник по миграции SQL Server на Aurora PostgreSQL
Совместимость функций | Уровень автоматизации AWS SCT / AWS DMS | Код действия AWS SCT, индекс | Ключевые отличия |
---|---|---|---|
Типы данных | PostgreSQL использует другие имена функций. |
Использование SQL Server
Функции даты и времени — это скалярные функции, которые выполняют операции с временными или числовыми входными данными и возвращают временные или числовые значения.
Системные значения даты и времени получены из операционной системы сервера, на котором работает SQL Server.
В этом разделе не рассматриваются особенности часового пояса и функции, учитывающие часовой пояс. Дополнительные сведения об обработке часовых поясов см. в разделе Типы данных.
Синтаксис и примеры
В следующей таблице приведены наиболее часто используемые функции даты и времени.
Функция | Назначение | Пример | Результат | Комментарии |
---|---|---|---|---|
| Возвращает значение даты и времени, содержащее текущую местную дату или время в формате UTC. | | 2018-04-05 15:53:01.380 | |
| Возвращает целочисленное значение, представляющее указанную | | 4, 2018 | |
| Возвращает целочисленное значение | | 25 | Сколько дней осталось до конца месяца. |
| Возвращает значение даты и времени, вычисляемое с интервалом смещения до указанной | | 2018-04-30 15:55:52. 147 | |
| Преобразует значения даты и времени в строковые литералы и обратно, а также в другие форматы даты и времени. | | 05.04.2018 20180405 | Формат даты по умолчанию. Стиль 112 (ISO) без разделителей. |
Дополнительные сведения см. в разделе Функции даты и времени в документации SQL Server .
Использование PostgreSQL
Amazon Aurora PostgreSQL-Compatible Edition (Aurora PostgreSQL) предоставляет очень богатый набор скалярных функций даты и времени; больше, чем SQL Server.
Хотя некоторые функции похожи на функции SQL Server, их функциональность существенно отличается. Будьте особенно осторожны при переносе темпоральной логики на парадигмы Aurora PostgreSQL.
Функции и определение
Функция PostgreSQL | Определение функции |
---|---|
| Вычесть из |
| Текущие дата и время. |
| Текущая дата. |
| Текущее время суток. |
| Текущая дата и время (начало текущей транзакции). |
| Получение подполя (эквивалентно извлечению). |
| Обрезать до указанной точности. |
| Получить подполе. |
| Проверка конечного интервала. |
| Отрегулируйте интервал таким образом, чтобы 30-дневные периоды времени представлялись в виде месяцев. |
| Отрегулируйте интервал таким образом, чтобы 24-часовые периоды времени представлялись в виде дней. |
| Настройка интервала с помощью |
| Текущее время суток. |
| Создать дату из полей года, месяца и дня. |
| Создать интервал из полей лет, месяцев, недель, дней, часов, минут и секунд. |
| Создать время из полей часов, минут и секунд. |
| Создать метку времени из полей года, месяца, дня, часа, минуты и секунды. |
| Создать метку времени с часовым поясом из полей года, месяца, дня, часа, минуты и секунды. Если часовой пояс не указан, используется текущий часовой пояс. |
СЕЙЧАС | Текущие дата и время. |
| Текущие дата и время. |
| Текущие дата и время (аналогично clock_timestamp, но в виде текстовой строки). |
| Текущие дата и время. |
| Преобразовать эпоху Unix (секунды с 1970-01-01 00:00:00+00) в метку времени. |