如何在postgres中获得月份的最后一天?

时间:2015-01-28 06:28:38

标签: sql postgresql amazon-redshift

如何在postgres中查找月份的最后一天? 我有一个日期列存储为数字(18)格式(YYYYMMDD) 我正在尝试使用

将其设为日期
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

6 个答案:

答案 0 :(得分:25)

对于任何人来到这个问题寻找 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;

答案 1 :(得分:7)

只需使用last_day功能:

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

PS:现在,我相信您知道为自己的问题选择合适的标签非常重要!

答案 2 :(得分:2)

好的,所以您的numeric(18)列包含20150118等数字。您可以将其转换为以下日期:

to_date(your_date_column::text, 'YYYYMMDD')

从日期开始,您可以抓取the last day of the month之类的内容:

(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.

答案 3 :(得分:1)

对于将来的搜索,Redshift不接受INTERVAL '1 month'。而是使用dateadd(month, 1, date)作为记录here

要使用月末,请使用:DATEADD(DAY, -1, (DATE_TRUNC('month', DATEADD(MONTH, 1, date))))

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

将任何日期或时间戳截断到月份级别将为您提供包含该日期的月份的第一天。添加一个月会给你下个月的第一个月。然后,删除一天将为您提供所提供日期的月份的最后一天的日期。