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 Spectrum 使用两个日期字段对表进行分区