Як витягнути рік і місяць з дати в PostgreSQL без використання функції to_char ()?


104

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

to_char(timestamp_column, 'YYYY-MM')

1
Чому замовлення не в порядку з to_char?
yairchu

1
Голосування про закриття як неясне, тому що незрозуміло, чому to_char () не прийнятно.
Алекс 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 ('рік', timetamp '2001-02-16 20:38:40')
МК.

дякую за швидку відповідь, але чи не можемо ми це зробити в одній функції або ми повинні дзвонити це два рази на місяць і рік окремо
mokNathal

2
що ти намагаєшся зробити? Просто дістаньте рядок? Потім використовуйте функцію to_char з форматом дати, вам потрібен postgresql.org/docs/8.2/static/functions-formatting.html
МК.

181
to_char(timestamp, 'YYYY-MM')

Ви кажете, що наказ не "правильний", але я не можу зрозуміти, чому це неправильно (принаймні, до того моменту, поки не вийде 10000 року).


якщо ви працюєте з "міткою часу" to_char (to_timestamp (наприклад, "мітка часу"), "MM-YYYY")
Бруно Лі,

@BrunoMarinho, якщо ви хочете в хронологічному порядку, тоді просто не використовуйте "MM-YYYY для замовлення". Якщо ви хочете, щоб це відображалося, ви все одно можете мати стовпець у такому форматі, але не замовляйте його
yairchu

4
Я не розумію, чому це не прийнята відповідь.
Prabowo Murti

У цьому випадку ви не можете ORDER BYпобачитись.
aagjalpankaj

1
@Aviator: Ви можете використовувати ORDER BY to_char(timestamp, 'YYYY-MM'). Або, якщо ви зробили це, SELECT to_char(timestamp, 'YYYY-MM') AS dateто можете просто використовувати ORDER BY date.
yairchu

38

Використовуйте 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 ('місяць', зараз ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Алехандро Саламанка Мазуело,

Вдвічі швидше, ніж "to_char (мітка часу," РРРР-ММ ")", що також добре.
Le Droid

20

Ви можете скоротити всю інформацію після місяця, використовуючи 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

16

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


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 ('рік', txndt) FROM "table_name", де date_part ('year', txndt)> '2000' межа 10; працює чудово. але для вибору date_part ('рік', txndt) ВІД "hpi_validator_q3". "cdm_inv_exceptions", де date_part ('рік', txndt) <'2000' межа 10; Я отримую помилку.
Anurag Bhardwaj

1
Це не відповідь - якщо у вас є питання, скоріше опублікуйте нове запитання, ніж додайте його як відповідь.
Маркоорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.