PostgreSQL'de to_char () işlevini kullanmadan yıldan yıl ve ay nasıl çıkarılır?


106

Sql: seçmek istiyorum SELECT "year-month" from table group by "year-month" AND order by date, burada yıl-ay - "1978-01", "1923-12" tarihi için format. couse çalışmasının to_char'ını seçin , ancak "doğru" siparişi seçmeyin :

to_char(timestamp_column, 'YYYY-MM')

1
To_char ile sipariş neden doğru değil?
yairchu

1
To_char () neden kabul edilebilir olmadığı açık olmadığından kapanış oyu belirsiz.
Alex R.

Yanıtlar:


68
date_part(text, timestamp)

Örneğin

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
ay ve yılı aynı anda nasıl çıkarabilirim? Bir örnek gösterebilir misin
mokNathal

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

hızlı yanıt için teşekkürler, ancak bunu tek işlevde yapamaz mıyız yoksa ay ve yıl için ayrı ayrı iki kez mi çağırmalıyız
mokNathal

2
ne yapmaya çalışıyorsun? Sadece bir ip mi aldın? Ardından, postgresql.org/docs/8.2/static/functions-formatting.html
.

182
to_char(timestamp, 'YYYY-MM')

Siparişin "doğru" olmadığını söylüyorsunuz, ancak neden yanlış olduğunu anlayamıyorum (en azından 10000 yılı gelene kadar).


"timestamp" to_char (to_timestamp (ör. "timestamp"), 'MM-YYYY') ile çalışıyorsanız
Bruno Lee

@BrunoMarinho Eğer kronolojik bir sıralama istiyorsanız, o zaman 'sipariş için MM-YYYY' kullanmayın. Bunun görüntülenmesini istiyorsanız, yine de bu formatta bir sütununuz olabilir, ancak ona göre sıralama yapmayın
yairchu

4
Neden kabul edilen cevap olmadığını anlamıyorum.
Prabowo Murti

Bu durumda flört edemezsin ORDER BY.
aagjalpankaj

1
@Aviator: Kullanabilirsiniz ORDER BY to_char(timestamp, 'YYYY-MM'). Veya alternatif olarak, eğer yaptıysanız SELECT to_char(timestamp, 'YYYY-MM') AS date, o zaman basitçe kullanabilirsiniz ORDER BY date.
yairchu

39

date_truncGünü (veya istediğiniz başka bir şeyi, örneğin hafta, yıl, gün vb.) Kesmek için yöntemi kullanın.

Satışları aylara göre siparişlerden gruplama örneği:

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

1
Doğru. U karşılaştırmak için kullanabilirsiniz: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

"To_char (zaman damgası," YYYY-MM ")" den iki kat daha hızlı ki bu da iyidir.
Le Droid

21

Aşağıdakileri kullanarak aydan sonra tüm bilgileri kesebilirsiniz date_trunc(text, timestamp):

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


Örnek:

Giriş:

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

Çıkış 1:

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

Çıktı 2:

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

Çıktı 3:

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

Çıktı 4:

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

17

1. Seçenek

date_trunc('month', timestamp_column)::date

Birinci günden başlayarak tüm aylar için tarih formatını koruyacaktır.

Misal:

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

2. Seçenek

to_char(timestamp_column, 'YYYY-MM')

@Yairchu tarafından önerilen bu çözüm benim durumumda iyi çalıştı. "Gün" bilgisini gerçekten atmak istedim.


11

EXTRACT işlevini pgSQL kullanabilirsiniz

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

Daha fazla ayrıntı için PGSQL Date-Time


1

En az "büyüktür" işlevleri için çalışıyor.

Örneğin:

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

iyi çalışıyor.

ama için

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

Hata alıyorum


Daha az değil, daha büyük işlevler için çalışıyor. Örneğin: tarih_bölüm ('yıl', txndt)> '2000' sınır 10; iyi çalışıyor. ancak "hpi_validator_q3" ten "cdm_inv_exceptions" tarih_bölümü ('yıl', txndt) seçmek için, burada date_part ('yıl', txndt) <'2000' sınırı 10; Hata alıyorum
Anurag Bhardwaj

1
Bu bir cevap değil - eğer bir sorunuz varsa, sorunuzu cevap olarak eklemek yerine yeni bir soru gönderin.
Markoorn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.