Jak wyodrębnić rok i miesiąc od daty w PostgreSQL bez użycia funkcji to_char ()?

105

Chcę wybrać sql SELECT "year-month" from table group by "year-month" AND order by date:, gdzie rok-miesiąc - format daty „1978-01”, „1923-12”. wybierz to_char of couse work , ale nie „właściwą” kolejność:

to_char(timestamp_column, 'YYYY-MM')
Bdfy
źródło
1
Dlaczego kolejność nie jest w porządku z to_char?
yairchu
1
Głosowanie za zamknięciem jest niejasne, ponieważ nie jest jasne, dlaczego to_char () jest niedopuszczalne.
Alex R

Odpowiedzi:

68
date_part(text, timestamp)

na przykład

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

MK.
źródło
5
jak wyodrębnić miesiąc i rok na raz? czy możesz pokazać przykład
mokNathal
3
data_part („miesiąc”, sygnatura czasowa „2001-02-16 20:38:40”), data_part („rok”, znacznik czasu „2001-02-16 20:38:40”)
MK.
dzięki za szybką odpowiedź, ale czy nie możemy tego zrobić w jednej funkcji, czy też musimy dzwonić dwa razy dla miesiąca i roku osobno
mokNathal
2
co próbujesz zrobić? Po prostu masz ciąg? Następnie użyj funkcji to_char z formatem daty, którego potrzebujesz postgresql.org/docs/8.2/static/functions-formatting.html
MK.
181
to_char(timestamp, 'YYYY-MM')

Mówisz, że kolejność nie jest „dobra”, ale ja nie rozumiem, dlaczego jest niewłaściwa (przynajmniej do czasu, gdy nadejdzie rok 10000).

yairchu
źródło
jeśli pracujesz z „timestamp” to_char (to_timestamp (np. „timestamp”), „MM-RRRR”)
Bruno Lee
@BrunoMarinho, jeśli chcesz uzyskać kolejność chronologiczną, po prostu nie używaj „MM-RRRR do składania zamówień”. Jeśli chcesz, aby to było wyświetlane, nadal możesz mieć kolumnę w tym formacie, ale nie zamawiaj według niej
yairchu
4
Nie rozumiem, dlaczego nie jest to akceptowana odpowiedź.
Prabowo Murti
W takim przypadku nie możesz ORDER BYrandkować.
aagjalpankaj
1
@Aviator: Możesz użyć ORDER BY to_char(timestamp, 'YYYY-MM'). Lub alternatywnie, jeśli tak SELECT to_char(timestamp, 'YYYY-MM') AS date, możesz po prostu użyć ORDER BY date.
yairchu
38

Użyj date_truncmetody, aby skrócić dzień (lub cokolwiek innego, np. Tydzień, rok, dzień itp.)

Przykład grupowania sprzedaży z zamówień według miesięcy:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;
Gerry Shaw
źródło
1
Zgadza się. Możesz użyć do porównania: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo
Dwa razy szybciej niż „to_char (timestamp, 'RRRR-MM')”, co też jest dobre.
Le Droid
20

Możesz skrócić wszystkie informacje po miesiącu, używając date_trunc(text, timestamp):

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


Przykład:

Wejście:

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

Wyjście 1:

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

Wyjście 2:

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

Wyjście 3:

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

Wyjście 4:

date_trunc('year',created_at)::date 
// 2019-01-01
Aya
źródło
16

1 opcja

date_trunc('month', timestamp_column)::date

Zachowa format daty z wszystkimi miesiącami zaczynającymi się od pierwszego dnia.

Przykład:

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

2. opcja

to_char(timestamp_column, 'YYYY-MM')

To rozwiązanie zaproponowane przez @yairchu sprawdziło się w moim przypadku. Naprawdę chciałem odrzucić informacje o „dniu”.

Luis Martins
źródło
11

Możesz użyć funkcji EXTRACT pgSQL

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

Aby uzyskać więcej informacji, PGSQL Date-Time

Singhak
źródło
1

Działa dla funkcji „większe niż” nie mniej niż.

Na przykład:

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

działa dobrze.

ale dla

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

Otrzymuję błąd.

Anurag Bhardwaj
źródło
Działa na więcej niż funkcje nie mniej niż. Na przykład: select date_part ('year', txndt) FROM "table_name" gdzie date_part ('year', txndt)> '2000' limit 10; działa dobrze. ale dla select date_part ('rok', txndt) OD "hpi_validator_q3". "cdm_inv_exceptions" gdzie date_part ('rok', txndt) <'2000' limit 10; Otrzymuję błąd.
Anurag Bhardwaj
1
To nie jest odpowiedź - jeśli masz pytanie, zadaj nowe pytanie, zamiast dodawać swoje pytanie jako odpowiedź.
Markoorn