to_char () 함수를 사용하지 않고 PostgreSQL의 날짜에서 연도와 월을 추출하는 방법은 무엇입니까?


104

sql :을 선택하고 싶습니다. SELECT "year-month" from table group by "year-month" AND order by date여기서 year-month-날짜 형식은 "1978-01", "1923-12"입니다. couse work의 to_char를 선택 하지만 "올바른"순서는 아닙니다.

to_char(timestamp_column, 'YYYY-MM')

1
to_char에서 주문이 잘못된 이유는 무엇입니까?
yairchu 2013

1
to_char ()가 허용되지 않는 이유가 명확하지 않기 때문에 불분명 한 것으로 마감하는 투표.
Alex R

답변:


68
date_part(text, timestamp)

예 :

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
한 번에 월과 연도를 추출하는 방법? 예제를 보여줄 수 있습니까?
mokNathal

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

빠른 답장을 보내 주셔서 감사합니다.하지만 단일 기능으로 할 수는
없나요

2
당신은 무엇을하려고합니까? 그냥 문자열 가져와? 그런 다음 postgresql.org/docs/8.2/static/functions-formatting.html
MK

181
to_char(timestamp, 'YYYY-MM')

당신은 그 주문이 "옳지 않다"고 말하지만, 나는 그것이 왜 잘못된 지 알 수 없습니다 (적어도 10000 년이 다가올 때까지).


"timestamp"to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')로 작업하는 경우
Bruno Lee

@BrunoMarinho는 연대순으로 주문하려면 'MM-YYYY'를 사용하지 마십시오. 표시하려는 경우 해당 형식의 열을 여전히 가질 수 있지만 순서는 없습니다.
yairchu

4
나는 왜 그것이 받아 들여지지 않는 대답인지 이해하지 못합니다.
Prabowo Murti 2017

이 경우 ORDER BY데이트 할 수 없습니다 .
aagjalpankaj

1
@Aviator : ORDER BY to_char(timestamp, 'YYYY-MM'). 또는 그렇게 SELECT to_char(timestamp, 'YYYY-MM') AS date했다면 간단히 사용할 수 있습니다 ORDER BY date.
yairchu

38

date_trunc방법을 사용하여 요일 (또는 주, 연도, 일 등 원하는 다른 항목)을 자릅니다.

월별 주문에서 판매를 그룹화하는 예 :

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

1
맞습니다. U can use to compare : date (date_trunc ( 'month', now ())) = to_Date (5 :: varchar || ''|| 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

"to_char (timestamp, 'YYYY-MM')"보다 두 배 빠르기도합니다.
Le Droid

20

다음을 사용하여 월 이후의 모든 정보를자를 수 있습니다 date_trunc(text, timestamp).

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


예 :

입력 :

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

출력 1 :

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

출력 2 :

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

출력 3 :

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

출력 4 :

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

16

첫 번째 옵션

date_trunc('month', timestamp_column)::date

모든 달이 첫날부터 시작되는 날짜 형식을 유지합니다.

예:

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

두 번째 옵션

to_char(timestamp_column, 'YYYY-MM')

@yairchu가 제안한이 솔루션은 제 경우에는 잘 작동했습니다. 나는 정말로 '일'정보를 버리고 싶었다.


11

EXTRACT 함수 pgSQL을 사용할 수 있습니다.

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

자세한 내용은 PGSQL 날짜-시간


1

보다 작지 않은 "보다 큼"기능에 대해 작동합니다.

예를 들면 :

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

잘 작동합니다.

이 아니라면

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

오류가 발생합니다.


그것은보다 작지 않은 기능을 위해 일하고 있습니다. 예 : select date_part ( 'year', txndt) FROM "table_name"where date_part ( 'year', txndt)> '2000'limit 10; 잘 작동합니다. 그러나 select date_part ( 'year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions"여기서 date_part ( 'year', txndt) < '2000'limit 10; 오류가 발생합니다.
Anurag Bhardwaj

1
이것은 답변이 아닙니다. 질문이있는 경우 답변으로 질문을 추가하는 대신 새 질문을 게시하십시오.
Markoorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.