web-dev-qa-db-ja.com

postgresで月の最終日を取得する方法は?

Postgresで月の最後の日を見つける方法は? format(YYYYMMDD)のnumeric(18)として保存された日付列があります。

_to_date("act_dt",'YYYYMMDD') AS "act date"
_

この日付の最終日を見つけます:このように:

_(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]
  -----------------------------------------------
_

何か助け?

Postgresバージョン:

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

last_day 関数を使用するだけで:

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

PS:今、私はあなたがあなた自身の質問に適切なタグを選ぶことが非常に重要であることを知っていると信じています!

7
Houari

Postgresこれを行う方法(Redshiftを使用しない)を探しているこの質問に答える人は、次のようにします。

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

'2017-01-05'を使用したい日付に置き換えます。これを次のような関数にすることができます。

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;
32
wspurgin

さて、20150118のような数字を含むnumeric(18)列ができました。次のような日付に変換できます。

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;

SQL Fiddleの例

3
Andomar

今後の検索では、Redshiftは_INTERVAL '1 month'_を受け入れません。代わりに、文書化された here としてdateadd(month, 1, date)を使用してください。

月末を取得するには、DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))を使用します。

1
Daniel Evanko

select to_char(date_trunc( 'month'、now()+ '01 Months ':: interval)-'01 Days' :: interval、 'YYYYmmDD' :: text):: numeric as end_period_n

0
Rakesh H B