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')

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


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).


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;

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

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”.


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.