Какой самый быстрый способ в ColdFusion получить первый и последний день квартала? - PullRequest
3 голосов
/ 05 октября 2009

Какой самый быстрый способ в ColdFusion получить первый и последний день квартала?

Кажется, для этого нет встроенной функции.

Ответы [ 6 ]

5 голосов
/ 05 октября 2009

Первый день квартала:

FirstDayOfQuarter = CreateDate(year, (quarter-1)*3 + 1, 1)

Последний день квартала:

LastDayOfQuarter = DateAdd("d", -1, DateAdd("m", 3, FirstDayOfQuarter))
5 голосов
/ 05 октября 2009

У меня такое ощущение, что ваш вопрос может быть более сложным, чем кажется ... для большинства целей эти значения являются известным набором - не нужно вычислять:

Quarters:

1 января - 31 марта 1 апреля - 30 июня 1 июля - 30 сентября 1 октября - 31 декабря

Поскольку набор известен заранее, для этого нет особой необходимости в функции - определить, в какую дату выпадет квартал, есть простая серия операторов "if" (psuedocode):

если дата> 1 октября, то Q4 еще если дата> 1 июля, то Q3 еще если дата> 1 апреля, то Q2 еще если дата> 1 января, то Q1

(В этом случае вы выполняете проверку в обратном порядке, чтобы сначала найти наиболее ограничивающее совпадение. Хотя, как указывает Кимваис, есть функция, которая делает именно это в CFML.)

Это должно быть в основном то же самое для других "квартальных" систем, если только эти даты не рассчитаны каким-либо образом.

Если я пропустил отметку, не стесняйтесь добавлять комментарии для уточнения.

3 голосов
/ 05 октября 2009

Проблема в том, что «квартал» является относительным термином, в то время как многие организации следуют по умолчанию с разбивкой по кварталам года, начиная с 1 января по 31 декабря, многие другие организации следуют за другими кварталами.

Например, большинство розничных организаций. Особенно те, которые зависят от Рождества, не хотят тратить время на финансовые результаты на конец квартала / года в декабре. Они также хотят, чтобы весь праздничный сезон (включая две недели после него) записывался в те же книги, что и остальная часть сезона. Так что для них «год» начинается 1 февраля.

Федеральное правительство США и большинство штатов начинают свой финансовый год 1 октября из-за того, как работают законодательные органы, выборы и бюджеты.

Таким образом, единственная функция, которая всегда работала только на одной четверти, никогда не сработает. Я уверен, что любая из функций, перечисленных в других ответах, хороша, если ваша программа работает только с одним набором. Но если вы кодируете приложение общего пользования, вы можете сделать его настраиваемым.

2 голосов
/ 05 октября 2009

Я не думаю, что для этого есть встроенные функции - неясно, ищете ли вы числовой день месяца или строковый день месяца (например, понедельник). В любом случае, это может быть немного чрезмерно - две функции, которые требуют целочисленного значения четверти и возвращают первую и последнюю даты квартала для дальнейшей манипуляции:

<cffunction name="QuarterFirstDate" returnType="date">
    <cfargument name="quarternumber" required="yes" type="numeric">
    <cfargument name="yr" type="numeric" default="2009">
    <cfargument name="startmonth" type="numeric" default="1">
    <cfset firstDate = DateAdd("m",startmonth-1,CreateDate(yr, ((quarternumber-1)*3)+1, "1"))>
    <cfreturn firstDate>
</cffunction>

<cffunction name="QuarterLastDate" returnType="date">
    <cfargument name="quarternumber" required="yes" type="numeric">
    <cfargument name="yr" type="numeric"  default="2009">
    <cfargument name="startmonth" type="numeric" default="1">
    <cfset lastDate = DateAdd("m",startmonth-1,CreateDate(yr, quarternumber*3, DaysInMonth(CreateDate(yr, quarternumber*3, "1"))))>
    <cfreturn lastDate>
</cffunction>

<cfset year = "2009">
<cfset startmonth = "1">

<cfloop index="quarter" from="1" to="4">
    <cfoutput>
        <h2>Quarter #quarter#</h2>
        #DateFormat(QuarterFirstDate(quarter, year, startmonth))#, day #DayOfYear(QuarterFirstDate(quarter, year, startmonth))#, #DayOfWeekAsString(DayOfWeek(QuarterFirstDate(quarter, year, startmonth)))#<br />
        #DateFormat(QuarterLastDate(quarter, year, startmonth))#, day #DayOfYear(QuarterLastDate(quarter, year, startmonth))#, #DayOfWeekAsString(DayOfWeek(QuarterLastDate(quarter, year, startmonth)))#<br />
    </cfoutput>
</cfloop>

edit: обновлено, чтобы можно было указывать месяц начала квартала

2 голосов
/ 05 октября 2009

Похоже, есть функция для определения квартала, на основании чего вы могли бы жестко их кодировать?

0 голосов
/ 03 июля 2018

Как насчет?

<cfset dt = now()>

<cfset DateLastQuarter = DateAdd("m",-3,dt)> <!--- Any date three months ago falls in previous quarter --->
<cfset quarterNumber = (month(DateLastQuarter)-1)\3+1> <!--- range from quarter 1-4 --->
<cfset StartQuarterMonth = (quarterNumber-1)*3+1> <!--- start of quarter month-number where Jan=1 (Mathematical magic) --->

<cfset LastQuarterFrom = CreateDate(year(DateLastQuarter),StartQuarterMonth,1)>
<cfset LastQuarterTo = DateAdd("d",-1,DateAdd("m",3,LastQuarterFrom))> <!--- the day before three months later --->

это выше возвращает первую дату в предыдущем квартале в LastQuarterFrom и последняя дата в предыдущем квартале в LastQuarterTo

...