簡體   English   中英

如何在postgres中獲得一個月的最后一天?

[英]How to get the last day of month in postgres?

如何在postgres中找到本月的最后一天? 我有一個日期列以格式(YYYYMMDD)存儲為數字(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

對於任何人來到這個問題尋找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;

如果您使用的是 Amazon AWS Redshift,那么您可以使用 Redshift 的LAST_DAY函數。 雖然 Redshift 基於 PostgreSQL,LAST_DAY函數在 PostgreSQL 中不可用,有關 PostgreSQL的解決方案,請參閱 @wspurgin 的回答

https://docs.aws.amazon.com/redshift/latest/dg/r_LAST_DAY.html

 LAST_DAY( { date | timestamp } )

LAST_DAY返回包含日期的月份的最后一天的日期。 無論日期參數的數據類型如何,返回類型始終為DATE

例如:

SELECT LAST_DAY( TO_DATE( act_date, 'YYYYMMDD' ) )

好的,所以您有一個numeric(18)列,其中包含諸如20150118數字。 您可以將其轉換為日期,例如:

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 中的示例。

對於未來的搜索,Redshift 不接受INTERVAL '1 month' 而是使用dateadd(month, 1, date)作為記錄在這里

要獲得月底,請使用: DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))

date_trunc('month',current_date) + interval '1 month' - interval '1 day'

將任何日期或時間戳截斷到月份級別將為您提供包含該日期的月份的第一天。 添加一個月會給你下個月的第一個月。 然后,刪除一天將為您提供所提供日期的月份的最后一天的日期。

選擇 to_char(date_trunc('month', now() + '01 Months'::interval) - '01 Days'::interval, 'YYYYmmDD'::text)::numeric as end_period_n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM