Bagaimana cara mengekstrak tahun dan bulan dari tanggal di PostgreSQL tanpa menggunakan fungsi to_char ()?


104

Saya ingin memilih sql SELECT "year-month" from table group by "year-month" AND order by date:, di mana tahun-bulan - format untuk tanggal "1978-01", "1923-12". pilih to_char of couse work , tetapi bukan urutan yang "benar":

to_char(timestamp_column, 'YYYY-MM')

1
Mengapa pemesanan tidak sesuai dengan to_char?
yairchu

1
Pemberian suara untuk ditutup tidak jelas karena tidak jelas mengapa to_char () tidak dapat diterima.
Alex R

Jawaban:


68
date_part(text, timestamp)

misalnya

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
bagaimana cara mengekstrak bulan dan tahun sekaligus? dapatkah Anda menunjukkan contoh
mokNathal

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

terima kasih untuk balasan cepat, tetapi tidak bisakah kita melakukannya dalam satu fungsi atau kita harus memanggilnya dua kali untuk bulan dan tahun secara terpisah
mokNathal

2
apa yang sedang Anda coba lakukan? Hanya mendapatkan seutas tali? Kemudian gunakan fungsi to_char dengan format tanggal yang Anda butuhkan postgresql.org/docs/8.2/static/functions-formatting.html
MK.

181
to_char(timestamp, 'YYYY-MM')

Anda mengatakan bahwa urutannya tidak "benar", tetapi saya tidak dapat melihat mengapa itu salah (setidaknya sampai tahun 10000 tiba).


jika Anda bekerja dengan "timestamp" to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')
Bruno Lee

@BrunoMarinho jika Anda ingin urutan kronologis, maka jangan gunakan 'MM-YYYY untuk memesan'. Jika Anda ingin yang ditampilkan, Anda masih dapat memiliki kolom dalam format itu tetapi tidak memesannya
yairchu

4
Saya tidak mengerti mengapa itu bukan jawaban yang diterima.
Prabowo Murti

Dalam hal ini, Anda tidak bisa ORDER BYberkencan.
aagjalpankaj

1
@ Aviator: Anda dapat menggunakan ORDER BY to_char(timestamp, 'YYYY-MM'). Atau alternatifnya jika Anda melakukannya, SELECT to_char(timestamp, 'YYYY-MM') AS dateAnda dapat langsung menggunakan ORDER BY date.
yairchu

38

Gunakan date_truncmetode untuk memotong hari (atau apa pun yang Anda inginkan, misalnya, minggu, tahun, hari, dll ..)

Contoh pengelompokan penjualan dari pesanan menurut bulan:

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

1
Betul sekali. Anda dapat menggunakan untuk membandingkan: tanggal (date_trunc ('bulan', sekarang ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

Dua kali lebih cepat dari "to_char (timestamp, 'YYYY-MM')" yang juga bagus.
Le Droid

20

Anda dapat memotong semua informasi setelah sebulan menggunakan date_trunc(text, timestamp):

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


Contoh:

Input:

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

Keluaran 1:

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

Keluaran 2:

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

Keluaran 3:

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

Keluaran 4:

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

16

Opsi 1

date_trunc('month', timestamp_column)::date

Ini akan mempertahankan format tanggal dengan semua bulan mulai dari hari pertama.

Contoh:

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

Opsi ke-2

to_char(timestamp_column, 'YYYY-MM')

Solusi yang diusulkan oleh @yairchu ini berfungsi dengan baik dalam kasus saya. Saya benar-benar ingin membuang info 'hari'.


11

Anda dapat menggunakan fungsi EXTRACT pgSQL

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

Untuk lebih jelasnya PGSQL Tanggal-Waktu


1

Ia bekerja untuk fungsi "lebih besar dari" tidak kurang dari.

Sebagai contoh:

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

bekerja dengan baik.

tapi untuk

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

Saya mendapatkan kesalahan.


Ini bekerja untuk lebih dari fungsi tidak kurang dari. Misalnya: pilih date_part ('year', txndt) FROM "table_name" where date_part ('year', txndt)> '2000' limit 10; bekerja dengan baik. tapi untuk pilih date_part ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" di mana date_part ('year', txndt) <'2000' limit 10; Saya mendapatkan kesalahan.
Anurag Bhardwaj

1
Ini bukan jawaban - jika Anda memiliki pertanyaan, lebih baik posting pertanyaan baru daripada menambahkan pertanyaan Anda sebagai jawaban.
Markoorn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.