将日期取整到下个月的第一天
Posted
技术标签:
【中文标题】将日期取整到下个月的第一天【英文标题】:Round date to first day of next month 【发布时间】:2018-02-21 22:32:07 【问题描述】:以下查询采用application_date
并给出申请月份的最后一天(cohort
)和申请周的星期日(first_week
):
select
cast(last_day(application_date) as date) end as cohort,
cast(dateadd(day, -(datepart(dow, application_date)), application_date) as date) first_week
from table
这非常适合我正在尝试做的事情,但是在 cohort
月份 first_week
月份的情况下,我想将 first_week
舍入到下个月的第一天(= cohort
月)。
当前输出示例:
application_date cohort first week
1/2/18 1/31/18 1/31/17
1/5/18 1/31/18 1/31/17
1/7/18 1/31/18 1/7/18
1/13/18 1/31/18 1/7/18
2/1/18 2/28/18 1/28/18
预期输出:
application_date cohort first week
1/2/18 1/31/18 1/1/18
1/5/18 1/31/18 1/1/18
1/7/18 1/31/18 1/7/18
1/13/18 1/31/18 1/7/18
2/1/18 2/28/18 2/1/18
谢谢!
【问题讨论】:
如果第一周是12/30/2017
怎么办?
@maSTAShuFu 这不可能发生。 first_week
可以是 12/31/2017 或 12/24/2017 或 1/7/2017 等,但不能是 12/30/2017,因为 first_week
的定义是 application_date
所在周的星期日。如果你的意思是如果application_date
是 12/30/2017 那么first_week
将是 12/24/2017,这不需要调整。
我建议展示更多示例以便更好地理解
@maSTAShuFu 确定,已更新
为什么 1/7/18 第一周是 1/7 也是 1/13?.. 能否请您包括第一周背后的逻辑。
【参考方案1】:
Case Statement
逻辑读为
1) 如果最后一个星期日是上个月的,则获取申请日期的第一天,这是您的第一周。 2) 如果申请日期不是星期天,则获取申请日期之前的星期天日期,而不是从上个月开始。
declare @mytable table (application_date date,cohort date)
insert into @mytable
values
('1/2/18','1/31/18'), -- 1/1/18
('1/5/18','1/31/18'), -- 1/1/18
('1/7/18','1/31/18'), -- 1/7/18
('1/13/18','1/31/18'), -- 1/7/18
('2/1/18','2/28/18'), -- 2/1/18
('2/27/18','2/28/18') -- 2/25/18
select *,
case when
month(
case when datepart(dw,application_date)=1 then application_date
else dateadd(day,(-1*datepart(dw,application_date))+1,application_date)
end
) <> month(application_date) then
cast(concat(year(application_date),right('0' + cast(month(application_date) as varchar(20)),2),'01') as date)
else
case when datepart(dw,application_date)=1 then
application_date
else
dateadd(day,(-1*datepart(dw,application_date))+1,application_date)
end
end firstweek
from @mytable
【讨论】:
@ma 不幸的是,这不是 Redshift 正确的语法,所以不能使用。 只需要翻译一下就可以了... IIF 类似case。 @user8834780 现在使用Case Statement
你必须翻译它
@ma 我让它工作了,但不幸的是它给出了不正确的输出。 week_end
适用于 1/1/2018-1/6/2018,application_date
of 12/31/2017 给出 week_end
of 12/1/2017,其余的 application_date
是星期一(而不是星期日)申请的那一周。以上是关于将日期取整到下个月的第一天的主要内容,如果未能解决你的问题,请参考以下文章
java中定义一个字符串类型的日期 算出这个月的第一天和下个月的第一天。
Python之计算当前月份的日期范围(calendardatetime)
sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天