Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Выгрузить даты по заданным условиям / 2 сообщений из 2, страница 1 из 1
24.05.2019, 12:32
    #39817688
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузить даты по заданным условиям
Здравствуйте!

Есть задача выгрузить даты
Код: sql
1.
 {[Начало дата предыдущего года]:[Окончание дата предыдущего года],[Начало дата текущего года]:[Окончание дата текущего года]}


по следующим условиям:
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-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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-запросе этот пункт якобы не корректно работает.

Вместо этого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
StrToMember("[Время].[Дата].&[" + VBA!Format(
	VBA!Dateadd('yyyy', -1, 
		VBA!Dateadd(
			'd',
		 	-1,
		 [Текущая дата].Item(0).MEMBERVALUE)),
	 'yyyy-MM-01T00:00:00') + "]").
	Lead(1)

написал так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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)



Мне кажется запрос написал не оптимально и слишком сложно. Скажите, как можно проще написать и чтоб корректно учитывался третий пункт?
...
Рейтинг: 0 / 0
27.05.2019, 23:21
    #39819012
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузить даты по заданным условиям
ferzmikkИз условии берем третий пункт. 3. Начало дата предыдущего года: Берем вчерашний день. От этого дня определяем дату как первое число соответствующего месяца и года. Далее минусуем год. Прибавляем один день. То есть надо определить текущий день, отнять один день, определили как первое число, минус год, прибавить 1 день.В общем,
Вариант 1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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)

Вариант 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
WITH
SET [Текущая дата] AS
	[Время].[Дата].&[2019-06-01T00:00:00]
SET [Начало дата предыдущего года] AS
	StrToMember(
			"[Время].[Дата].&[" + 
				VBA!Format(
					VBA!Dateadd(
							'd',
							1,						
								VBA!Dateadd(
									'yyyy',
									 -1,
									VBA!DateSerial(
										VBA!Year(VBA!Dateadd(
												'd',
												 -1,
												[Текущая дата].Item(0).MEMBERVALUE
										)),
										VBA!Month(VBA!Dateadd(
												'd',
												 -1,
												[Текущая дата].Item(0).MEMBERVALUE
										)),
										1
									)								
								)							
						),				
					'yyyy-MM-ddT00:00:00'
				) 
			+
			"]"
		)
SELECT
{} ON 0,
[Начало дата предыдущего года] ON 1
FROM PROFIT


Вначале получил первый вариант. При разработке второго варианта без использования двойного StrToMember (как в пером варианте) и с использованием больше VBA - получился довольно сложный.

Возможно ли как то сделать по другому, но попроще?
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Выгрузить даты по заданным условиям / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]