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

Har*_*hna 15 sql postgresql amazon-redshift

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

to_date("act_dt",'YYYYMMDD') AS "act date"
Run Code Online (Sandbox Code Playgroud)

然后找到这个日期的最后一天:像这样:

(select (date_trunc('MONTH',to_date("act_dt",'YYYYMMDD')) + INTERVAL '1 MONTH - 1 day')::date)
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误:

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]
  -----------------------------------------------
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

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

wsp*_*gin 36

对于任何人来到这个问题寻找Postgres的方法(不使用Redshift),这是你如何做到这一点:

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

'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;
Run Code Online (Sandbox Code Playgroud)

  • @giò因为last_day是一个redshift函数.正如我在回答中所说,这就是你如何用PostgreSQL做同样的事情.对于那些提出这个问题并且没有使用redshift的人来说,这就是他们如何能够实现与last_day函数相同的功能.至于它是否更快/更慢,谁能说?您可以自己测试它们,然后通知我们所有人. (7认同)
  • 哦,我不知道 postgres 没有 last_day 功能,真可惜 (3认同)
  • 您还可以在单​​个间隔内进行间隔数学,至少在 PG11+ select date_trunc('month', now()) + Interval '1 Month -1 day' 中 (3认同)

Hou*_*ari 9

只需使用last_day函数:

select last_day(to_date(act_date,'YYYYMMDD'))
Run Code Online (Sandbox Code Playgroud)

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

  • `last_day()` 不是 Postgres 函数。虽然它_会_适用于原始发帖者(他最后确实说他们在 AWS Redshift 上运行“PostgreSQL 8.0.2”),但它实际上并不是他们提出的问题的答案,特别是“如何获得最后一天” Postgres 中的月份?” (15认同)
  • @HareRamaHareKrishna:你的Postgres版本是什么?请编辑您的问题,并将"select version()"的输出添加到您的问题中. (2认同)

小智 8

date_trunc('month',current_date) + interval '1 month' - interval '1 day'
Run Code Online (Sandbox Code Playgroud)

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


And*_*mar 6

好的,现在您有一numeric(18)列包含诸如 之类的数字20150118。您可以将其转换为日期,例如:

to_date(your_date_column::text, 'YYYYMMDD')
Run Code Online (Sandbox Code Playgroud)

从日期中,您可以获取该月的最后一天,例如:

(date_trunc('month', your_date_column) + 
    interval '1 month' - interval '1 day')::date;
Run Code Online (Sandbox Code Playgroud)

结合起来,你会得到:

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

SQL Fiddle 中的示例。