Здравствуйте!
Есть задача выгрузить даты
{[Начало дата предыдущего года]:[Окончание дата предыдущего года],[Начало дата текущего года]:[Окончание дата текущего года]}
по следующим условиям:
1. Начало дата текущего года: Берем вчерашний день. От этого дня определяем дату как первое число соответствующего месяца и года.
2. Окончание дата текущего года: Берем вчерашний день. От этого дня определяем дату.
3. Начало дата предыдущего года: Берем вчерашний день. От этого дня определяем дату как первое число соответствующего месяца и года. Далее минусуем год. Прибавляем один день.
4. Окончание дата предыдущего года: Берем вчерашний день. От этого дня определяем дату. Далее минусуем год. Прибавляем один день.
В итоге, должно получится так
Если сейчас 31.05.2019, то для текущего года: 1.05.2019-30.05.2019, а для предыдущего: 2.05.2018-31.05.2018
Если сейчас 1.06.2019, то для текущего года: 1.05.2019-31.05.2019, а для предыдущего: 2.05.2018-1.06.2018
Если сейчас 2.06.2019, то для текущего года: 1.06.2019-01.06.2019, а для предыдущего: 2.06.2018-2.06.2018
Написал такой MDX-запрос.
+MDX-запрос |
WITH
SET [Текущая дата] AS
[Время].[Дата].&[2019-06-03T00:00:00]
SELECT
{} ON 0,
{StrToMember("[Время].[Дата].&[" + VBA!Format(VBA!Dateadd('yyyy', -1, VBA!Dateadd('d', -1, [Текущая дата].Item(0).MEMBERVALUE)), 'yyyy-MM-01T00:00:00') + "]").Lead(1):
StrToMember("[Время].[Дата].&[" + VBA!Format(VBA!Dateadd('yyyy', -1, VBA!Dateadd('d', -1, [Текущая дата].Item(0).MEMBERVALUE)), 'yyyy-MM-ddT00:00:00') + "]").Lead(1),
StrToMember("[Время].[Дата].&[" + VBA!Format(VBA!Dateadd('d', -1, [Текущая дата].Item(0).MEMBERVALUE), 'yyyy-MM-01T00:00:00') + "]"):
StrToMember("[Время].[Дата].&[" + VBA!Format(VBA!Dateadd('d', -1, [Текущая дата].Item(0).MEMBERVALUE), 'yyyy-MM-ddT00:00:00') + "]")}
ON 1
FROM PROFIT
|
Из условии берем третий пункт.
3. Начало дата предыдущего года: Берем вчерашний день. От этого дня определяем дату как первое число соответствующего месяца и года. Далее минусуем год. Прибавляем один день. То есть надо определить текущий день, отнять один день,
определили как первое число, минус год, прибавить 1 день. А в MDX-получается определили текущий день, отняли один день,
минус год, определили как первое число, прибавляем 1 день. Выделенные шаги будто местами поменялись и в MDX-запросе этот пункт якобы не корректно работает.
Вместо этого
StrToMember("[Время].[Дата].&[" + VBA!Format(
VBA!Dateadd('yyyy', -1,
VBA!Dateadd(
'd',
-1,
[Текущая дата].Item(0).MEMBERVALUE)),
'yyyy-MM-01T00:00:00') + "]").
Lead(1)
написал так
StrToMember("[Время].[Дата].&[" + VBA!Format(
VBA!Dateadd(
'yyyy',
-1,
StrToMember(
"[Время].[Дата].&[" + VBA!Format(
VBA!Dateadd(
'd',
-1,
[Текущая дата].Item(0).MEMBERVALUE),
'yyyy-MM-01T00:00:00') + "]").MEMBERVALUE),
'yyyy-MM-01T00:00:00') + "]").
Lead(1)
Мне кажется запрос написал не оптимально и слишком сложно. Скажите, как можно проще написать и чтоб корректно учитывался третий пункт?