Как извлечь год и месяц из даты в PostgreSQL без использования функции to_char ()?


106

Я хочу выбрать sql:, SELECT "year-month" from table group by "year-month" AND order by dateгде год-месяц - формат даты «1978-01», «1923-12». выберите to_char работы , но не в "правильном" порядке:

to_char(timestamp_column, 'YYYY-MM')

1
Почему порядок с to_char неверен?
yairchu

1
Голосование за закрытие так же неясно, потому что непонятно, почему to_char () неприемлемо.
Alex R

Ответы:


68
date_part(text, timestamp)

например

date_part('month', timestamp '2001-02-16 20:38:40'),
date_part('year', timestamp '2001-02-16 20:38:40') 

http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html


5
как извлечь месяц и год сразу? можете показать пример
mokNathal

3
date_part ('месяц', отметка времени '2001-02-16 20:38:40'), date_part ('год', отметка времени '2001-02-16 20:38:40')
МК.

спасибо за быстрый ответ, но мы не можем сделать это в одной функции, или мы должны вызывать ее дважды в течение месяца и года отдельно
mokNathal

2
Что ты пытаешься сделать? Просто возьми веревочку? Затем используйте функцию to_char с нужным вам форматом даты postgresql.org/docs/8.2/static/functions-formatting.html
MK.

182
to_char(timestamp, 'YYYY-MM')

Вы говорите, что порядок неправильный, но я не понимаю, почему он неправильный (по крайней мере, до 10000 года).


если вы работаете с "отметкой времени" to_char (to_timestamp (например, "отметка времени"), 'ММ-ГГГГ')
Бруно Ли

@BrunoMarinho, если вам нужен хронологический порядок, просто не используйте «ММ-ГГГГ для заказа». Если вы хотите, чтобы это отображалось, вы все равно можете иметь столбец в этом формате, но не упорядочивайте по нему
yairchu

4
Я не понимаю, почему это не принятый ответ.
Prabowo

В этом случае вы не можете ORDER BYвстречаться.
aagjalpankaj 09

1
@Aviator: Вы можете использовать ORDER BY to_char(timestamp, 'YYYY-MM'). Или, если вы это сделали, SELECT to_char(timestamp, 'YYYY-MM') AS dateвы можете просто использовать ORDER BY date.
yairchu 09

39

Используйте этот date_truncметод, чтобы обрезать день (или что угодно, например, неделю, год, день и т. Д.)

Пример группировки продаж из заказов по месяцам:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;

1
Это правильно. Вы можете использовать для сравнения: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Алехандро Саламанка Мазуэло

В два раза быстрее, чем to_char (timestamp, 'YYYY-MM'), что тоже хорошо.
Le Droid

21

Вы можете усечь всю информацию после месяца, используя date_trunc(text, timestamp):

select date_trunc('month',created_at)::date as date 
from orders 
order by date DESC;


Пример:

ввод:

created_at = '2019-12-16 18:28:13'

Выход 1:

date_trunc('day',created_at)
// 2019-12-16 00:00:00

Выход 2:

date_trunc('day',created_at)::date 
// 2019-12-16

Выход 3:

date_trunc('month',created_at)::date 
// 2019-12-01

Результат 4:

date_trunc('year',created_at)::date 
// 2019-01-01

17

1-й вариант

date_trunc('month', timestamp_column)::date

Он будет поддерживать формат даты со всеми месяцами, начиная с первого дня.

Пример:

2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

2-й вариант

to_char(timestamp_column, 'YYYY-MM')

Это решение, предложенное @yairchu, отлично работало в моем случае. Очень хотелось отбросить «дневную» информацию.



1

Он работает для функций "больше чем" не меньше чем.

Например:

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) > '2000' limit 10;

работает нормально.

но для

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) < '2000' limit 10;

Я получаю ошибку


Работает на большее, чем на функции, а не на меньшее. Например: выберите date_part ('year', txndt) FROM "table_name", где date_part ('year', txndt)> '2000' limit 10; работает нормально. но для select date_part ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions", где date_part ('year', txndt) <'2000' limit 10; Я получаю ошибку
Анураг Бхардвадж

1
Это не ответ - если у вас есть вопрос, лучше опубликуйте новый вопрос, чем добавляйте свой вопрос в качестве ответа.
Markoorn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.