postgresql — Как обрезать дату в postgres?
спросил
Изменено 2 года, 1 месяц назад
Просмотрено 8к раз
Я использую условие ниже, чтобы обрезать дату в postgres
to_date(to_char(trunc(appointment_date),'YYYYMMDD')||appointment_end_time,''YYYYMMDDHh34:MI:SS')AS tq
Как я могу использовать это в postgres?
- postgresql
- дата-арифметика
3
Странная типизация данных, иногда требуются странные, по крайней мере на вид, запросы. Попробуйте (см. скрипку)
date_trunc('day',appointment_date) + substr(appoinment_end,12)::интервал
0
Поскольку ваш вызов to_char()
'Hh34:MI:SS'
для столбца «время», вы можете привести этот столбец непосредственно к значению time
, например. используя оператор ::
: назначение_end_time::time
. Чтобы построить новую метку времени из части даты Назначение_дата
и значение времени, просто добавьте их:
назначение_дата::дата + назначение_конец_время::время
Итак, сначала метка времени преобразуется в дату (у которой нет времени), а затем к ней добавляется значение времени, что дает метка времени
.
Обратите внимание, что to_date()
возвращает дату
, поэтому ваш код снова удалит только что добавленную часть времени. Вам нужно будет использовать to_timestamp()
, если вы действительно хотите получить временную метку в качестве результата.
Чтобы ответить на заголовок вопроса «как обрезать дату в Postgres?» (что на самом деле относится к отметке времени
, а не к дате
): вы можете либо привести ее к дате
(см. выше), либо использовать date_trunc()
(не trunc()
) с единицей измерения, до которой оно должно быть усечено. Однако date_trunc
возвращает отметку времени
, а не значение даты , поэтому вы не можете добавить время к результату.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
sql — Отличие от даты усечения (Postgresql)
Задавать вопрос
спросил
Изменено 3 года, 4 месяца назад
Просмотрено 300 раз
У меня есть таблица с createdAt
и поле id
.
SELECT * FROM ( SELECT DISTINCT ON («дата») DATE_TRUNC («месяц», «создано в») AS «дата», «создано в» ОТ "Баланс кошелька" ГДЕ "Идентификатор кошелька" = 1 СОРТИРОВАТЬ ПО "дата" DESC) t СОРТИРОВАТЬ ПО "создано в" DESC;
Этот запрос преобразует этот
+-----------+--------------- + | идентификатор кошелька | создано в | +----------+-------------------------------+ | 1 | 2019-11-20 20:00:00.00000+03 | +----------+-------------------------------+ | 1 | 2019-11-21 20:00:00.00000+03 | +----------+-------------------------------+ | 1 | 2019-10-17 20:00:00.00000+03 | +----------+-------------------------------+ | 1 | 2019-10-14 20:00:00.00000+03 | +----------+-------------------------------+
К этому
+----------+---------------+- -----------------------+ | идентификатор кошелька | создано в | дата | +----------+-------------------------------+------- ------------------+ | 1 | 2019-11-21 20:00:00.00000+03 | 2019-11-01 00:00:00+03 | +----------+-------------------------------+------- ------------------+ | 1 | 2019-10-17 20:00:00.00000+03 | 2019-10-01 00:00:00+03 | +----------+-------------------------------+------- ------------------+
Проблема в том, что DISTINCT ON ("дата") DATE_TRUNC('month', "createdAt") AS "дата"
использует 2019-10-17 20:00:00.00000+03
в качестве уникального поля (? ), но не слишком ранняя дата 2019-10-14 20:00:00.00000+03
, что представлено в табл.
Как получить такой результат? Таким образом, DISTINCT ON
всегда будет использовать самую маленькую дату.
+----------+----------------+----- -----+ | идентификатор кошелька | создано в | дата | +----------+-------------------------------+------- ------------------+ | 1 | 2019-11-21 20:00:00.00000+03 | 2019-11-01 00:00:00+03 | +----------+-------------------------------+------- ------------------+ | 1 | 2019-10-14 20:00:00.00000+03 | 2019-10-01 00:00:00+03 | +----------+-------------------------------+------- ------------------+
Я что-то упустил?
- sql
- postgresql
У вас обратная логика:
SELECT DISTINCT ON (DATE_TRUNC('month', "createdAt")) DATE_TRUNC('месяц', "создано в") КАК "дата", "создано в" ОТ "Баланс кошелька" ГДЕ "walletId" = 1 ЗАКАЗАТЬ ПО дате ASC;
Вы можете использовать подзапрос, если действительно хотите получить результаты в порядке убывания.