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;
Вы можете использовать подзапрос, если действительно хотите получить результаты в порядке убывания.
