Redshift - 在两个日期之间添加日期(月间隔)

Posted

技术标签:

【中文标题】Redshift - 在两个日期之间添加日期(月间隔)【英文标题】:Redshift - Adding dates (month interval) between two dates 【发布时间】:2020-08-11 17:23:08 【问题描述】:

使用 Amazon Redshift。 还有一个包含所有可用日历日期的日期表。

问题:如何获取开始时间戳 (created_at) 和结束时间戳 (end_at) 并添加一列,将开始时间戳添加 1 个月直到结束时间戳。

我有一张桌子:

user_id, plan_id, created_at, ended_at,(可以为空)

因此,如果我的 created_at 时间戳为 2019-07-11,我将有一列包含 2019-08-11、2019-09-11、2019-10-11 等的附加行。目标是将用户每月支付的金额与仅以开始和结束日期开始的日期相关联。

编辑:

我使用了以下查询,该查询在存在 end_at 时间戳时有效,但是,当它为空时,我需要填充下个月,直到存在 end_at 时间戳。

select
ps.network_id,
ps.user_id,
ps.plan_id,
ps.created_at,
extract('day' from ps.created_at) as extract_day,
d.calendar_date,
ps.archived_at as ended_at,
ps.application_fee_percent,
pp.amount,
pp.interval,
pp.name
from payments_subscriptions ps
left outer join dates d on extract('day' from date_trunc('day',d.calendar_date)) = extract('day' from ps.created_at) AND date_trunc('day',d.calendar_date) >= date_trunc('day',ps.created_at) AND date_trunc('day',d.calendar_date) < date_trunc('day',ps.archived_at) 
left outer join payments_plans pp on ps.plan_id = pp.id
where ps.network_id = '1318990'
and ps.user_id = '2343404'
order by 3,6 desc

output from above query - subscription with null ended_at needs to continue until ended_at is present

【问题讨论】:

【参考方案1】:

使用 dateadd 函数增加时间戳中的时间/日期 https://docs.aws.amazon.com/redshift/latest/dg/r_DATEADD_function.html

为了增加一个月使用这个:

DATEADD(月,1,CURRENT_TIMESTAMP)

【讨论】:

我认为它不仅仅是一个日期添加不是吗?例如,未结束的月度订阅需要采用 created_at 时间戳,并为每个后续时间戳添加 1 个月,直到出现 end_at。【参考方案2】:

对于任何寻找潜在解决方案的人,我最终以这种方式加入我的日期表:

LEFT OUTER JOIN dates d ON extract('day' FROM date_trunc('day',d.calendar_date)) = extract('day' FROM payments_subscriptions.created_at)
                            AND date_trunc('day',d.calendar_date) >= date_trunc('day',payments_subscriptions.created_at)
                            AND date_trunc('day',d.calendar_date) < date_trunc('day',getdate())

还有这个 where 子句:

WHERE (calendar_date < date_trunc('day',payments_subscriptions.archived_at) OR payments_subscriptions.archived_at is null)

【讨论】:

以上是关于Redshift - 在两个日期之间添加日期(月间隔)的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift UDF 中求和

Redshift Spectrum 使用两个日期字段对表进行分区

昨天 - 在 Redshift 和 PostgreSQL 中 - 日期添加兼容性

在 Redshift 中使用 python UDF 中的表

Redshift 中的无效数据错误

两个日期之间的 Wordpress 搜索