iAnkitBhatt Ответов: 2

Как получить дневные разницы и диапазоны финансовых дат, указав дату начала и дату окончания


я застрял в этой точке.
мне нужна помощь для расчета дневной разницы для финансового приложения.

1. две даты в качестве входных данных.
2. диапазон дат будет классифицирован в соответствии с индийскими финансовыми годами (апрель-март)
3. первый диапазон будет начинаться с даты начала. и последний сгенерированный диапазон будет только до даты окончания.
4. дневная разница для каждого генерируемого диапазона.

будущее использование:
5. Далее я могу использовать эту каждую разницу для финансового приложения о точной амортизации активов.


Ввод
@StartDate = 2015-12-12
@EndDate  = 2018-12-12



Ожидаемый результат :

srNo  startdate(A)    EndDate(B)   CalculatedDayDiff  
1.    2015-12-12  2016-03-31  ==> <Diffrence>
2.    2016-04-01  2017-03-31  ==> <Diffrence>
3.    2017-04-01  2018-03-31  ==>  <Diffrence>
4.    2018-04-01  2018-12-12  ==>  <Diffrence>


Что я уже пробовал:

я попробовал несколько кодов, но ни один из них не был полностью релевантен для достижения ожидаемого результата.

CHill60

Ваш вопрос не совсем ясен. Может быть, если бы вы дали нам некоторые примеры данных для продолжения и некоторые реальные ожидаемые результаты? Кроме того, не публикуйте код, который не является релевантным

iAnkitBhatt

нет никаких данных. мне нужен ожидаемый результат для выполнения дальнейшей операции, основанной на "ожидаемом выходе" из предоставленных двух дат. опять упрощаю свой вопрос.

1. две даты в качестве входных данных.
2. диапазон дат будет классифицирован в соответствии с индийскими финансовыми годами (апрель-март)
3. первый диапазон будет начинаться с даты начала. и последний сгенерированный диапазон будет только до даты окончания.
4. дневная разница для каждого генерируемого диапазона.

будущее использование:
5. Далее я могу использовать эту ежедневную разницу для финансового применения для амортизации активов за каждый год

Gerry Schmitz

Просто сначала рассчитайте "разницу дат". Затем вы можете рассмотреть другие вещи, так как вы, кажется, слишком растянуты.

iAnkitBhatt

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

Gerry Schmitz

Да, вам, вероятно, нужен "номер актива". И амортизация обычно рассчитывается каждый месяц; и накапливается до тех пор, пока актив не будет амортизирован; и в зависимости от типа актива существуют различные ставки амортизации. Амортизацию обычно хранят в вспомогательной книге активов, которая затем разносится в главную книгу для формирования финансовой отчетности. Обычно я использую C# для этой части.

iAnkitBhatt

Еще одна попытка дана, но почему-то не в состоянии правильно сгенерировать диапазон дат: разница в Днях правильна.

SQL-запрос:
ОБЪЯВЛЯТЬ
@MinDate DATE = '2015-12-12',
@MaxDate DATE = '2018-12-12';

ВЫБЕРИТЕ ПТ.* от (
ВЫБЕРИТЕ ФУТЫ.*,Функция dateadd(день, DayDifference-1, ФТ.Начальная дата) как дата окончания от
(Выберите FiscalYear,Count(UT.dt) как DayDifference ,@MinDate как StartDate
из (выбрать St.ДТ,год(функция dateadd(месяц, -3, ст.ДТ)) как fiscalyear
from(SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
Функция dateadd(день, функции row_number() над(приказ.аргумент object_id) - 1, @MinDate) как ДТ
Из представления sys.all_objects крест соединение sys.all_objects Б) как ст) УТ
Group BY fiscalyear) as FT ) PT


ВЫХОД:
FiscalYear DayDifference Начальная Дата Конечная Дата
2015 111 2015-12-12 2016-03-31
2016 365 2015-12-12 2016-12-10
2017 365 2015-12-12 2016-12-10
2018 256 2015-12-12 2016-08-23

Gerry Schmitz

2. диапазон дат будет классифицирован в соответствии с индийскими финансовыми годами (апрель-март)

Простой факт заключается в том, что практически каждая финансовая система использует "таблицу" для управления своими "отчетными периодами / месяцами" для каждого финансового года ... Потому что еще одна функция этой "таблицы периодов" состоит в том, чтобы контролировать, является ли период "открытым" или "закрытым"; т. е.

Таким образом, ваши попытки "обратного расчета" отчетных периодов будут считаться "неприемлемой" бухгалтерской практикой.

Вы должны иметь возможность взять дату, сопоставить ее с таблицей периодов и получить "период", к которому она относится (открытый/закрытый; финансовый год; квартал и т. д.)

iAnkitBhatt

Джерри, спасибо за ответ.

да, я рассчитываю, однако период открыт или закрыт для каждого финансового года, потому что.

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

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

и есть ограничение на определение любой таблицы для диапазона фискальных дат, и приведенный выше запрос решения будет объединен с другим запросом, как только я достигну этого




но все ,что вы предоставляете, является правильным логическим потоком, если мы хотим управлять таблицей рядов внутри сервера базы данных.

2 Ответов

Рейтинг:
5

iAnkitBhatt

Дорогие все, спасибо за ваши ответы...
На данный момент достигнуто работоспособное решение...
пожалуйста, вернитесь, если какая-либо оптимизация или эффективность доступна только по запросу Select...


Запрос:

DECLARE
@MinDate DATE = '2015-12-12',
@MaxDate DATE = '2018-12-12';
SELECT FT.Row_Number,FT.Endfiscalyear-1 as StartFiscalYear,
FT.Endfiscalyear, FT.DayDifference,
CASE WHEN FT.Row_Number = 1 THEN DATEADD(DD,-FT.DayDifference+1,FT.EndDate) 
ELSE DATEADD(day,1,DATEADD(YEAR,-1,FT.EndDate ))
END  as startDate , CASE WHEN FT.Row_Number > 1 AND FT.DayDifference < 365 THEN  @MaxDate 
ELSE FT.EndDate END  as EndDate 
from (SELECT ROW_NUMBER() OVER(ORDER BY Endfiscalyear) AS Row_Number,
Endfiscalyear,Count(UT.dt) as DayDifference,
DATEFROMPARTS (Endfiscalyear-1,04,01) as StartDate,
DATEFROMPARTS (Endfiscalyear,03,31) as EndDate
from (select st.dt,year(dateadd(month, -3 + 12, st.dt)) as Endfiscalyear
from(SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) as dt
FROM sys.all_objects a CROSS JOIN sys.all_objects b) as st) as UT
Group BY Endfiscalyear) as FT 



Выход:


RN  SFY     EFY   DayDiff  stDate	  EndDate
1	2015	2016	111	2015-12-12	2016-03-31
2	2016	2017	365	2016-04-01	2017-03-31
3	2017	2018	365	2017-04-01	2018-03-31
4	2018	2019	256	2018-04-01	2018-12-12


Рейтинг:
2

#realJSOP

Я написал Совет/трюк, который включает в себя сохраненный процесс, который позволяет вам построить календарь, включающий финансовые даты.

Создание календаря без ранее существовавших таблиц[^]

В этом коде финансовый год начинается 01 октября, поэтому фискальное смещение равно 3. Так что если ваш финансовый старт-01 июня, то смещение будет равно 8 (я думаю).