Какой самый эффективный способ рассчитать последний день текущего квартала?
Пример: учитывая дату 3/5/09, я хочу вернуть 3/31/09.
Платформа является ColdFusion и SQL Server
SELECT DATEADD(qq, DATEDIFF(qq, - 1, '3/5/09'), - 1)
В этом ответе используются встроенные функции Quarter и DaysInMonth:
#createDate(year(now()), (quarter(now())*3), daysInMonth(createDate(year(now()), quarter(now())*3,1)) )#
Возможно, будет легче читать, если его немного сломать.
РЕДАКТИРОВАТЬ (@Sam Farmer: я позволил себе преобразовать ваше предложение в функцию CF)
<cffunction name="LastOfQuarter" returntype="date" output="no" access="public"> <cfargument name="d" type="date" required="no" default="#Now()#"> <cfset d = CreateDate(Year(d), Quarter(d) * 3, 1)> <cfreturn DateAdd("d", d, DaysInMonth(d) - 1)> </cffunction>
Для этого может потребоваться некоторый рефакторинг, но следует изложить основную идею.
<cffunction name="lastDayOfQuarter"> <cfargument name="d" default="#now()#"> <cfif month(d) lte 3> <cfreturn createDate(year(d),03,31)> </cfif> <cfif month(d) lte 6> <cfreturn createDate(year(d),06,30)> </cfif> <cfif month(d) lte 9> <cfreturn createDate(year(d),9,30)> </cfif> <cfreturn createDate(year(d),12,31)> </cffunction>
Чтобы получить квартал с определенной даты:
SELECT dateadd(dd,-1,dateadd(qq,1,DATEADD(qq, DATEDIFF(qq,0,<date here>), 0)))
Или, если вы имеете в виду текущий квартал:
SELECT dateadd(dd,-1,dateadd(qq,1,DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)))