Sql

Trunc postgresql date: PostgreSQL date_trunc Function By Examples

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 .

И я пытаюсь получить каждый 1-й день каждого месяца

 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;
 

Вы можете использовать подзапрос, если действительно хотите получить результаты в порядке убывания.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *