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')
Bdfy.dll
sumber
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

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

yairchu
sumber
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;
Gerry Shaw
sumber
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
Aya
sumber
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'.

Luis Martins
sumber
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

Singhak
sumber
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.

Anurag Bhardwaj
sumber
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