【问题标题】:Calculate the last day of the prior quarter计算上一季度的最后一天
【发布时间】:2010-09-23 01:55:13
【问题描述】:

计算上一季度最后一天的最有效方法是什么?

示例:给定日期 2008 年 11 月 19 日,我想返回 2008 年 9 月 30 日。

平台是 SQL Server

【问题讨论】:

  • '9/30/2008' 的期望结果是什么? “2008 年 6 月 30 日”?
  • 是的,并且要捕获所有限制:10/1/2008 应该是 9/30/2008

标签: sql sql-server date


【解决方案1】:

其实更简单的是:

SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), -1)

【讨论】:

    【解决方案2】:
    convert(varchar, dateadd(dd,-1,dateadd(qq,1,DATEADD(qq, DATEDIFF(qq,0,YOUR_DATE), 0))),112)
    

    您也可以根据以下列表更改 112

    SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM (or PM)
                                            -- Oct  2 2008 11:01AM
    SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy - 10/02/2008                  
    SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           
    SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy
    SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy
    SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy
    SELECT convert(varchar, getdate(), 106) -- dd mon yyyy
    SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy
    SELECT convert(varchar, getdate(), 108) --  hh:mm:ss
    SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)
                                            -- Oct  2 2008 11:02:44:013AM   
    SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy
    SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd
    SELECT convert(varchar, getdate(), 112) -- yyyymmdd
    SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm
                                            --  02 Oct 2008 11:02:07:577     
    SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)
    SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
    SELECT convert(varchar, getdate(), 121) --  yyyy-mm-dd hh:mm:ss.mmm
    SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                                            --  2008-10-02T10:52:47.513
    -- SQL create different date styles with t-sql string functions
    SELECT replace(convert(varchar, getdate(), 111), '/', ' ') -- yyyy mm dd
    SELECT convert(varchar(7), getdate(), 126)                 -- yyyy-mm
    SELECT right(convert(varchar, getdate(), 106), 8)          -- mon yyyy
    

    【讨论】:

    • 问题不在于以任何方式转换为 VARCHAR,而在于获得一个季度末的日期。
    • yaya,我知道,但我想会有人和我一样的人。他们也只想以 yyyymmdd 格式获取季度的最后一个日期。谢谢
    【解决方案3】:

    如果@Date 有问题的日期

    Select DateAdd(day, -1, dateadd(qq, DateDiff(qq, 0, @Date), 0)) 
    

    编辑:感谢下面的@strEagle,更简单的是:

    Select dateadd(qq, DateDiff(qq, 0, @Date), -1) 
    

    【讨论】:

    • 我也有同样的想法,但我不知道“qq”位。让事情变得更容易......
    【解决方案4】:

    亚马逊红移:

    上一季度的最后一天:

    select dateadd(day,-1,DATE_TRUNC('qtr', current_date)) from whatever
    

    当前季度的最后一天:

    select dateadd(qtr,1,dateadd(day,-1,DATE_TRUNC('qtr', current_date))) from whatever
    

    【讨论】:

    • 平台是 SQL Server。不支持DATE_TRUNC
    【解决方案5】:

    获取当前日期

    SELECT CONVERT(DATE,GETDATE()) [Current Date]
    

    获取当前日期的季度第一天

    SELECT CONVERT(DATE, DATEADD(QQ, DATEDIFF(QQ, 0, GETDATE())  ,0)) [Current Quarter 1st Date]
    

    获取当前日期的季度最后日期

    SELECT CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) +1, 0))) [Current Quarter Last Date]
    

    获取当前日期下一季度的第一个日期

    SELECT CONVERT(DATE, DATEADD(QQ, DATEDIFF(QQ, 0, GETDATE()) +1 ,0)) [Next Quarter 1st Date]
    

    获取当前日期下一季度的最后一个日期

    SELECT CONVERT(DATE,DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) +2, 0))) [Next Quarter Last Date]
    

    【讨论】:

    • 我认为如果你能解释你做了什么会很棒。然后,更多的人将能够理解您的建议。
    【解决方案6】:

    我想出了这个(测试了所有月份):

    select dateadd(dd,-1,dateadd(qq,datediff(qq,0,'11/19/2008'),0)),
           dateadd(dd,-1,dateadd(qq,datediff(qq,0,'10/19/2008'),0)),
           dateadd(dd,-1,dateadd(qq,datediff(qq,0,'12/19/2008'),0))
    

    结果可能是最简单的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多