将日期取整到下个月的第一天

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 Count 天数到本月的第一天

sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天

Java中获取去年最后一天的日期