2015-01-28 2 views
4

포스트그레스에서 달의 마지막 날을 찾는 방법은 무엇입니까? 이 같은 : 는 내가 그 다음이 날짜의 마지막 날을 찾을 수포스트 그레스에서 월말을 얻는 방법?

to_date("act_dt",'YYYYMMDD') AS "act date" 

를 사용하여 날짜를 만들려고 노력하고 형식 (YYYYMMDD) (18) 숫자로 저장 날짜 열이

(select (date_trunc('MONTH',to_date("act_dt",'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day')::date) 

그러나 그것은 나에게이 오류 제공 :

ERROR: Interval values with month or year parts are not supported 
    Detail: 
    ----------------------------------------------- 
    error: Interval values with month or year parts are not supported 
    code:  8001 
    context: interval months: "1" 
    query:  673376 
    location: cg_constmanager.cpp:145 
    process: padbmaster [pid=20937] 
    ----------------------------------------------- 

어떤 도움을?

포스트 그레스 버전 :

PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.874

+0

'to_date'는 문자열만을 날짜로 변환합니다. 열에 유닉스 에포크 값이 포함되어 있다면'to_timestamp' :'to_timestamp (act_dt) :: date'를 사용해야합니다. –

+0

@ AudriusKažukauskas : \t 오류 : to_timestamp (숫자) 함수가 존재하지 않습니다. 힌트 : 함수가 주어진 이름 및 인수 유형과 일치하지 않습니다. 명시 적 타입 캐스트를 추가해야 할 수도 있습니다. ? –

+0

'to_timestamp'는 배정 밀도 타입이 필요합니다.'to_timestamp (act_dt :: float8) :: date'에 컬럼을 캐스팅 해보세요. BTW,이 칼럼에 유닉스 신기원 시간 값이 저장되어 있는지 확인할 수 있습니까? 그렇지 않은 경우 귀하의 질문에 정확히 무엇이 저장되어 있는지에 대한 설명을 제공해야합니다. –

답변

4

간단히 last_day 기능을 사용하여 :

select last_day(to_date(act_date,'YYYYMMDD')) 

추신 : 이제 자신의 질문에 맞는 태그를 선택하는 것이 매우 중요하다는 사실을 알고 계신 것으로 알고 있습니다.

+0

'오류 : 월 또는 연도 부분이있는 간격 값은 지원되지 않습니다. 상세 : -------------------------------- --------------- 오류 : 월 또는 연도 부품이있는 간격 값은 지원되지 않습니다. 코드 : 8001 컨텍스트 : 간격 월 : "1" 쿼리 : 674275' any help? –

+2

@HareRamaHareKrishna : 정확한 Postgres 버전은 무엇입니까? 질문을 편집하고'select version()'의 결과를 질문에 추가하십시오. –

+0

@a_horse_with_no_name : 감사합니다. –

1

좋아, 그래서 당신은 20150118 같은 숫자를 포함하는 numeric(18) 열을 가지고있다. 이 같은 the last day of the month 잡을 수 날짜에서

to_date(your_date_column::text, 'YYYYMMDD') 

: 당신은 같은 날짜로 그것을 변환 할 수 있습니다

(date_trunc('month', your_date_column) + 
    interval '1 month' - interval '1 day')::date; 

결합을, 당신은 얻을 것이다 :

select (date_trunc('month', to_date(act_dt::text, 'YYYYMMDD')) + 
      interval '1 month' - interval '1 day')::date 
from YourTable; 

Example at SQL Fiddle.

+1

Andomar : Now()가 내 정수형 날짜입니다. 날짜를 만들어 now() .. 대신 사용하십시오.이게 작동하지 않습니다.'(select (date_trunc ('MONTH', to_date ("act_dt" , 'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day') :: date) 위와 같이 오류가납니다. ' –

+0

@HareRamaHareKrishna : 귀하의 질문에 분명했습니다. 답변을 업데이트했습니다. – Andomar

+0

오류 : to_timestamp (숫자) 함수가 없습니다. 힌트 : 주어진 이름 및 인수 유형과 일치하는 함수가 없습니다. 명시 적 타입 캐스트를 추가해야 할 수도 있습니다. ? –

0

추후 검색시 Redshift는 INTERVAL '1 month'을 허용하지 않습니다. 대신 dateadd(month, 1, date)을 문서화 된대로 here으로 사용하십시오. 여기 당신이 그것을 할 거라고 방법, (Redshift에 사용 안 함)이 작업을 수행 할 식으로 포스트 그레스를 찾고이 질문에 오는 사람을 위해 DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))

3

:

는 월 사용의 끝을 얻으려면

SELECT (date_trunc('month', '2017-01-05'::date) + interval '1 month' - interval '1 day')::date 
AS end_of_month; 

'2017-01-05'을 원하는 날짜로 바꿉니다. 당신은이 같은 함수에이를 수 있습니다 : ') :: 간격 - '01의 일'+ 01 개월) (지금

create function end_of_month(date) 
returns date as 
$$ 
select (date_trunc('month', $1) + interval '1 month' - interval '1 day')::date; 
$$ language 'sql' 
immutable strict; 
0

선택 TO_CHAR (date_trunc ('달':: 간격을, 'YYYYMMDD' :: 텍스트) :: 숫자로 end_period_n

관련 문제