计算上个季度的最后一天。

10

如何高效地计算前一个季度的最后一天?

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

平台为SQL Server。


“9/30/2008”和“6/30/2008”的期望结果是什么? - TToni
是的,并捕获所有限制:10/1/2008 应该是 9/30/2008。 - Bob Probst
6个回答

27
如果@Date是相关日期
Select DateAdd(day, -1, dateadd(qq, DateDiff(qq, 0, @Date), 0)) 

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

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

我也是这么想的,但我不知道“qq”位。这使得事情变得容易多了... - TToni

17

实际上更简单的方法是:

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

8

获取当前日期

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]

2
我认为如果你能解释一下你所做的事情,那将是非常好的。这样更多的人就能理解你提出的建议了。 - jazzurro

3
我想到了以下内容(已测试适用于所有月份):
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))

可能会证明它是最简单的。

0
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转换无关,只是关于获取季度末日期的问题。 - TT.
我知道,但我认为会有其他人和我一样。他们也只想以yyyymmdd格式获取一个季度的最后日期。谢谢。 - ManhNguyen

-2

在Amazon Redshift中:

上个季度的最后一天:

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函数。 - strickt01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接