Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Определение начала финансового года  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Добрый день.
Подскажите, как можно определить начало фиксального года, по такому условию:
Если пятая суббота в календарном году приходится на 29-й день в календарном году или позже, то началом фискального года считается пятая суббота. Иначе началом года считается шестая суббота календарного года.
Соответственно концом предыдущего фискального года будет день, предшествующий первому дню текущего фискального года, т.е. пятая или шестая пятница в календарном году.
В фискальном году может быть 364 либо 371 день.

Голову сломал уже.
13 авг 14, 11:16    [16435368]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Офисный Хомячок
Member

Откуда: Офис
Сообщений: 1358
А что не получилось при реализации?

И да я бы на вашем месте завел табличку и рассчитал эти самые начала финансового года на столетие вперед и забыл.
13 авг 14, 11:37    [16435555]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
хмхмхм
Guest
Mustang1234567,

Создаете таблицу, записываете в нее результат запроса:

declare @dateb datetime
declare @datee datetime
select @dateb='20000101',@datee='30000101'




;with dates([date], date_part, [year]) as (select @dateb, datepart(dw, @dateb), datepart(year, @dateb)
union all
select dateadd(dd,1,[date]), datepart(dw, dateadd(dd,1,[date])), datepart(year, dateadd(dd,1,[date]))
from dates
where [date]<@datee
)select date, date_part, [year], row_number() over (partition by [year], date_part order by [date]) as date_part_num, row_number() over (order by [date]) as day_num
 from dates
 order by [date]
OPTION (MAXRECURSION 0);


Ну а дальше уже в этой таблице по году выбираете нужный день недели и его номер в году.
13 авг 14, 11:48    [16435620]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Так я так и хочу сделать. А как рассчитать начало финансового года скриптом? Вручную это дибилизм
13 авг 14, 11:49    [16435625]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Спасибо
13 авг 14, 11:49    [16435630]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mustang1234567
А как рассчитать начало финансового года скриптом? Вручную это дибилизм

Ну так узнайте на какой календарный день года приходится 5-я суббота года
В чем проблема ?
13 авг 14, 11:52    [16435649]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
declare @d date = '2014';

select
 d as [Пятая суббота года],
 datediff(day, @d, d) as [Календарный день пятой субботы года]
from
 (select dateadd(week, 4, dateadd(day, 6 - (datepart(weekday, dateadd(week, 5, @d)) + @@datefirst - 1) % 7, @d))) t(d);
13 авг 14, 12:24    [16435820]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
DECLARE @Y CHAR(4)='2014';
SELECT [Начало финансового года]=DATEADD(DAY,34-DATEDIFF(DAY,-1,@Y)%7+DATEDIFF(DAY,-1,@Y)%7/6*7,@Y);
13 авг 14, 12:49    [16435969]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
DECLARE @Y CHAR(4)='2014';
SELECT [Начало финансового года]=
 CAST
 (
  @Y+
  CASE DATEDIFF(DAY,0,@Y)%7
   WHEN 0 THEN '0203'
   WHEN 1 THEN '0202'
   WHEN 2 THEN '0201'
   WHEN 3 THEN '0131'
   WHEN 4 THEN '0130'
   WHEN 5 THEN '0205'
   WHEN 6 THEN '0204'
  END
  AS DATETIME
 );
13 авг 14, 13:15    [16436150]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
А жто можно как нибудь сделать через цикл while?
Типо Declare ....

А дальше

While (2002)
BEGIN
...
...
...
И дальше рассчитывается на 10 лет вперёд

Подскажите как, если можно конечно.
14 авг 14, 13:34    [16441265]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mustang1234567
Подскажите как, если можно конечно.

Подставить в предложенные запросы свою таблицу с годами(датами) смелости не хватает что ли ?
14 авг 14, 13:38    [16441301]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
Офисный Хомячок
Member

Откуда: Офис
Сообщений: 1358
Mustang1234567
А жто можно как нибудь сделать через цикл while?
Типо Declare ....

А дальше

While (2002)
BEGIN
...
...
...
И дальше рассчитывается на 10 лет вперёд

Подскажите как, если можно конечно.


Если у вас все совсем плохо с t-sql возьмите скрипт iap и исполните его 10 раз меня год
(делов на 2 минуты).

В крайнем случае можете взять календарик и рассчитать сами займет минут 15 для 10 лет.
14 авг 14, 13:49    [16441384]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
mrGuest
Guest
iap
DECLARE @Y CHAR(4)='2014';
SELECT [Начало финансового года]=
 CAST
 (
  @Y+
  CASE DATEDIFF(DAY,0,@Y)%7
   WHEN 0 THEN '0203'
   WHEN 1 THEN '0202'
   WHEN 2 THEN '0201'
   WHEN 3 THEN '0131'
   WHEN 4 THEN '0130'
   WHEN 5 THEN '0205'
   WHEN 6 THEN '0204'
  END
  AS DATETIME
 );


А если год начинается с субботы, то 5-я суббота разве не 29 января?

Мой вариант:
declare	@by int,
	@ey int
select	@by = 2000,
	@ey = 2050

;with T(y) as (
	select	@by
	union all
	select	y+1
	from	T
	where	y < @ey
)
	select	y,
		dateadd(day, 35 - isnull(nullif(@@datefirst, 7), 0) - coalesce(nullif(datepart(dw, cy), 7), 0), cy)
	from	T cross apply (select cast(y as char(4))) as f(cy)
14 авг 14, 14:19    [16441559]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
mrGuest
Guest
Пардон не дочитал.. может быть 6я суббота)
14 авг 14, 14:20    [16441568]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
mrGuest
Guest
Сравнил результаты с iap, на выборке с 2000 до 2050 года сошлось, кроме годов начинающихся в субботу. В моем случае началом года является 29 января, в случае iap - на неделю позже.

Перечитал условие, так и не понял в каком же случае должна быть 6-я суббота :)
Судя по варианту iap, в случае когда 5-я суббота приходится на 29-е января. Но как это соответствует условию:
Если пятая суббота в календарном году приходится на 29-й день в календарном году или позже, то началом фискального года считается пятая суббота
14 авг 14, 14:39    [16441689]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
mrGuest
Сравнил результаты с iap, на выборке с 2000 до 2050 года сошлось, кроме годов начинающихся в субботу. В моем случае началом года является 29 января, в случае iap - на неделю позже.

Перечитал условие, так и не понял в каком же случае должна быть 6-я суббота :)
Судя по варианту iap, в случае когда 5-я суббота приходится на 29-е января. Но как это соответствует условию:
Если пятая суббота в календарном году приходится на 29-й день в календарном году или позже, то началом фискального года считается пятая суббота
Кажется, пятая суббота всегда 29-й день в году или больше.
(Сейчас проверил - так и есть!)
В таком случае надо вернуть всегда 5-ю субботу?
А зачем же тогда хитрое рассуждение про 6-ю субботу?
14 авг 14, 16:03    [16442176]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
iap
mrGuest
Сравнил результаты с iap, на выборке с 2000 до 2050 года сошлось, кроме годов начинающихся в субботу. В моем случае началом года является 29 января, в случае iap - на неделю позже.

Перечитал условие, так и не понял в каком же случае должна быть 6-я суббота :)
Судя по варианту iap, в случае когда 5-я суббота приходится на 29-е января. Но как это соответствует условию:
пропущено...
Кажется, пятая суббота всегда 29-й день в году или больше.
(Сейчас проверил - так и есть!)
В таком случае надо вернуть всегда 5-ю субботу?
А зачем же тогда хитрое рассуждение про 6-ю субботу?
WITH CTE AS
(
 SELECT N=ROW_NUMBER()OVER(PARTITION BY YEAR(D) ORDER BY D),*
 FROM Dates
 WHERE DATEDIFF(DAY,0,D)%7=5
)
SELECT D, DATEPART(DayOfYear,D)
FROM CTE WHERE N=5 AND DATEPART(DayOfYear,D)<29;
Где Dates(D DATE) - таблица с датами за сто лет!
14 авг 14, 16:06    [16442201]     Ответить | Цитировать Сообщить модератору
 Re: Определение начала финансового года  [new]
mrGuest
Guest
[quot iap]
iap
пропущено...
Кажется, пятая суббота всегда 29-й день в году или больше.
(Сейчас проверил - так и есть!)
В таком случае надо вернуть всегда 5-ю субботу?
А зачем же тогда хитрое рассуждение про 6-ю субботу?
[src]

Видимо тс хотел всех запутать или сам запутался)
14 авг 14, 16:44    [16442462]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить