Как извлечь год и месяц из даты в 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')
Bdfy
источник
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, отлично работало в моем случае. Очень хотелось отбросить «дневную» информацию.

Луис Мартинс
источник
11

Вы можете использовать функцию EXTRACT pgSQL

EX- date = 1981-05-31
EXTRACT(MONTH FROM date)
it will Give 05

Подробнее о PGSQL Date-Time

Сингхак
источник
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