Сообщество
Логин
Пароль
Забыли пароль?     Регистрация
Ещё проектики
Рабочее время
Минималистичный счётчик рабочего времени онлайн
Общение / Веб версия / история курсов валют

История курсов валют

Кирилл
7 декабря 2013 20:12
Admin Пишет:
Именно так.
Ну раз вы специалист и вам интересно, то приведите пример такого запроса с простым джойном и перемножением. Может быть откроете нам глаза и мы быстро всё сделаем :).
Не знаю как будет работать на больших объемах, но принцип у меня супер примитивный.

Вот по ссылке можно посмотреть работу http://sqlfiddle.com

DDL:

CREATE TABLE ExchangeRates(DateID DATE, ToCurrencyID INT(4), FromCurrencyID INT(4), Rate FLOAT(16,8));
CREATE TABLE Expenses(DateID DATE, CurrencyID INT(4), Val FLOAT(25,8));
INSERT ExchangeRates VALUES ('2013-12-05',840,974,(10000/35.3488)*33.2632);
INSERT ExchangeRates VALUES ('2012-11-24',840,974,(10000/36.4123)*31.1325);
INSERT ExchangeRates VALUES ('2012-11-24',840,980,(10/38.1877)*31.1325);
INSERT ExchangeRates VALUES ('2013-10-01',840,840,1);
INSERT Expenses VALUES ('2013-12-05', 974, 50000000);
INSERT Expenses VALUES ('2013-12-05', 974, 300000000);
INSERT Expenses VALUES ('2013-10-01', 840, 400);
INSERT Expenses VALUES ('2012-11-24', 980, 1500);
INSERT Expenses VALUES ('2012-11-24', 974, 60000000);

Запросы:
select sum(e.val/r.rate) from expenses e LEFT OUTER JOIN exchangerates r
ON e.DateID=r.DateID and e.CurrencyID=r.FromCurrencyID and r.ToCurrencyID=840;
select e.*,r.rate, e.val/r.rate from expenses e LEFT OUTER JOIN exchangerates r
ON e.DateID=r.DateID and e.CurrencyID=r.FromCurrencyID and r.ToCurrencyID=840;

Сорри, я не использовал mysql уже лет 7 и ничего не помню, прошу учитывать) Таблица с курсами будет очень большая, но с нормальным индексом должна работать. Способ примитивный. Могу подумать, чтобы считалось используя только курсы ЦБ РФ относительно рубля, т.е. 35 курсов.
Кирилл
7 декабря 2013 20:59
Вот вариант вычислений без большой таблицы.

вероятно по этой ссылке сайтик будет с заполненным кодом: http://sqlfiddle.com/#!2/eeec1/2/0
Если нет, вбивайте запросы сюда http://sqlfiddle.com

DDL:
CREATE TABLE Expenses(DateID DATE, CurrencyID INT(4), Val FLOAT(25,8));
CREATE TABLE Rates(DateID DATE, CurrencyID INT(4), RateToRUR FLOAT(16,8));

INSERT Rates VALUES ('2013-12-05',840,33.2632);
INSERT Rates VALUES ('2013-12-05',974,35.3488/10000);
INSERT Rates VALUES ('2012-11-24',840,31.1325);
INSERT Rates VALUES ('2012-11-24',974,36.4123/10000);
INSERT Rates VALUES ('2012-11-24',980,38.1877/10);
INSERT Rates VALUES ('2013-10-01',840,32.4839);

INSERT Expenses VALUES ('2013-12-05', 974, 50000000);
INSERT Expenses VALUES ('2013-12-05', 974, 300000000);
INSERT Expenses VALUES ('2013-10-01', 840, 400);
INSERT Expenses VALUES ('2012-11-24', 980, 1500);
INSERT Expenses VALUES ('2012-11-24', 974, 60000000);

Запросы:
select sum(e.Val*r1.RateToRur/r2.RateToRur) from expenses e
LEFT OUTER JOIN rates AS r1
ON e.DateID=r1.DateID and e.CurrencyID=r1.CurrencyID
LEFT OUTER JOIN rates AS r2
ON e.DateID=r2.DateID and r2.CurrencyID=840;
select * from rates;

select e.*,r1.RateToRur AS R1,r2.RateToRur AS R2, e.Val*r1.RateToRur/r2.RateToRur from expenses e
LEFT OUTER JOIN rates AS r1
ON e.DateID=r1.DateID and e.CurrencyID=r1.CurrencyID
LEFT OUTER JOIN rates AS r2
ON e.DateID=r2.DateID and r2.CurrencyID=840;
select * from rates;
Admin
 
7 декабря 2013 21:20
Кирилл Пишет:
Не знаю как будет работать на больших объемах
Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы.

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

Но за идею спасибо, возможно как-то получится поэкспериментировать и что-нибудь добиться в этом направлении. Может что-то придумаем в каком-то урезанном виде, только для некоторых валют и ещё с парочкой каких-нибудь ограничений.
Кирилл
8 декабря 2013 11:33
Admin Пишет:
Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы.
Мне кажется, второй вариант вполне реалистичен, и его можно сделать опционально для тех, кому очень надо. Кому не надо, пускай ставят свои курсы или используют сегодняшний курс. Затянуть исторические данные в нужном виде для центробанка России из 35 валют за 10 лет - это не так уж и много. Проверьте плз такой запрос. Если вы напишете, что такой двойной джоин на инфе за 5-6 лет неподъемен - мне придется смириться.

Можете кстати сделать такой пункт отчетов - только в платной версии)

Второй вариант - в табличке трат добавить поле суммы в валюте. Сумму отчетности выбрать в настройках. И в отчетности использовать уже это поле.

Третий вариант - сделать отчет трат и доходов по месяцам и годам (как это сделано в отчетах справа - очень удобная штука), где сохранялиьс бы предрасчитанные значения, которые например 1 раз в месяц обновляются. Можно даже сделать это как отчет на е-мэйл по прошествую месяца. Я бы даже доплачивал 50-100 руб к подписке за подобный отчет ежемесячный отчет, который сам приходит. Там например структура расходов-доходов за месяц и правильно посчитанный баланс доходов-расходов по месяцам и годам.
Ilyan
8 декабря 2013 18:27
Admin Пишет:
Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы.
Готов поспорить, что на всех пользователей дребеденег не более нескольких тысяч валют.

А если автоматически поддерживать не только валюты ЦБР, но и ещё несколько десятков более экзотических, то это число сократится до считаных сотен.

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

Плюс оптимизации:

1. Обычно >90% операций сделаны в валюте отчета и не требуют пересчета.
2. Обычно >90% отчетов не выходят за последние 6 месяцев.

Вы говорите "скорее всего" - это значит, что за последние 4 года вы его не даже попробовали? Не посмотрели сколько времени берет примитивная реализация? Не прикидывали, где можно улучшить?
Ilyan
8 декабря 2013 18:32
Да в конце концов - один раз посчитать и потом хранить для каждой транзакции её сумму в основной валюте пользователя - ведь 99.9% отчетов делаются именно с пересчетом в неё.
Ilyan
8 декабря 2013 18:40
Admin Пишет:
Но за идею спасибо, возможно как-то получится поэкспериментировать и что-нибудь добиться в этом направлении.
За 4 года вы не попробовали даже самый примитивный вариант.

Злодеи... :)
Maxim Hegel
20 декабря 2013 12:57
Admin Пишет:
Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы.
Вообще не понимаю в чём проблема, завести отдельную таблицу на пользователя (семью) с его личными курсами.

Например, имеем на входе:
• 20 валют
• 20 лет
• 365 дней в году

Итого 20*20*365 = 146 000 - с таким объёмом справится любой нормальный скуль сервер, даже не заметив!
И привёл очень пессимистичный вариант, у 90% пользователей этот объём не будет превышать и 30 тыс. записей.

Может просто проблема в серверных мощностях или всё таки в нежелании делать?
medved
26 декабря 2013 10:56
Админ,
Как продвигаются дела в этом направлении? Или никак?

Итоги года проанализировать невозможно:(. К сожалению в нашей стране в начале года курс был 1USD - 8600BYR, а к концу 1USD - 9500.

Если будет история курсов, тут же куплю премиум подписку:)
Admin
 
26 декабря 2013 11:33
medved Пишет:
Как продвигаются дела в этом направлении?
Запланировано пока поэкспериментировать с этим вопросом, возможно в начале следующего года руки дойдут. Если результаты в каком-то виде будут пригодны - прикрутим.
medved
26 декабря 2013 11:47
Admin Пишет:
medved Пишет:Как продвигаются дела в этом направлении?Запланировано пока поэкспериментировать с этим вопросом, возможно в начале следующего года руки дойдут. Если результаты в каком-то виде будут пригодны - прикрутим.
Отлично, будем надеется, что получится.
Admin
 
20 января 2014 15:59
Прикручено, проверяйте. История курсов берётся внешняя, т.е. пользовательское изменение курсов игнорируется.

Спасибо Кириллу за идею, она оказалась работоспособной.

Заодно ушли от курсов ЦБ РФ, т.е. теперь при желании можно добавить в автообновление (и стало быть историю) любую из 160 валют мира.
Кирилл
20 января 2014 20:52
Admin Пишет:
Прикручено, проверяйте. История курсов берётся внешняя, т.е. пользовательское изменение курсов игнорируется. Спасибо Кириллу за идею, она оказалась работоспособной. Заодно ушли от курсов ЦБ РФ, т.е. теперь при желании можно добавить в автообновление (и стало быть историю) любую из 160 валют мира.
Супер! Спасибо огромнейшее! Проверил по среднегодовому курсу общие годовые расходы с 2008. Очень все точно получается. Офигенно. Сейчас видна реальная статистика! Молодцы!

Рекомендую подумать над ежемесячным письмом рассылкой с графиками и важными цифрами на е-мэйл для платных экаунтов. Было бы полезно раз в месяц смотреть отчеты и специально никуда не ходить.
Кирилл
20 января 2014 21:01
Идеи для инфографики:
- Общий доход - общий расход (сравнение с прошлыми тремя месяцами, годом + среднемесячный за всю историю)
- Общие остатки на начало месяца, на конец месяца
- Сумма по топ 3 тегам
- Топ5 трат
- Суммы по Топ3 самых частых категорий за месяц
- Выполнение месячных планов
- Топ5 долгов
- Топ5 остатков (положительных\отрицательных) по местам хранения
- Изменение по доходам по топ3 категориям доходов (сравнение с прошлыми тремя месяцами, годом + среднемесячный за всю историю)

Фантазии нету предела))

Желательно чтобы в настройках можно было выбрать что именно должно включаться в очет.
Алексей
21 января 2014 10:25
Наконец-то!! Ура! Спасибо!
zvuk_on
21 января 2014 10:48
Спасибо огромное! продолжим премиум-подписку :)
medved
22 января 2014 23:23
Admin Пишет:
Прикручено, проверяйте. История курсов берётся внешняя, т.е. пользовательское изменение курсов игнорируется. Спасибо Кириллу за идею, она оказалась работоспособной. Заодно ушли от курсов ЦБ РФ, т.е. теперь при желании можно добавить в автообновление (и стало быть историю) любую из 160 валют мира.
Огромное спасибо за решение этой насущной проблемы!!!

Сегодня добрались руки проверить. К сожалению обнаружил довольно большие расхождения.
Например:
1) за 2011 год сумма в белорусских рублях конвертированная в доллары по курсу нацбанка нашей страны в этот день равна 293 USD, а в отчете дребеденьгах показывает 430. Проверил различные даты 2011 года, везде такие большие разбежки, в каждом месяце.
2) За 2012 год разбежки уже не такие большие, порядка 5 долларов на 1000.
3) За 2013 год разбежки ещё меньше, порядка 1 доллара на 2000.

Как бы это проверить?
Admin
 
23 января 2014 11:44
medved Пишет:
за 2011 год сумма в белорусских рублях конвертированная в доллары по курсу нацбанка нашей страны в этот день равна 293 USD
Сформируйте отчёт "детально", чтобы были видны конкретные траты в пересчёте на USD. Найдите те, у которых есть расхождения, и проверьте курс на день совершения операции. И приведите пример конкретной операции, которая пересчиталась не верно. Будем смотреть.
medved
23 января 2014 13:38
Admin Пишет:
medved Пишет:за 2011 год сумма в белорусских рублях конвертированная в доллары по курсу нацбанка нашей страны в этот день равна 293 USDСформируйте отчёт "детально", чтобы были видны конкретные траты в пересчёте на USD. Найдите те, у которых есть расхождения, и проверьте курс на день совершения операции. И приведите пример конкретной операции, которая пересчиталась не верно. Будем смотреть.
Так собствено говоря я так и делал. Проверил кучу операций, сравнивал с курсом по нац. банку рб. Выше я приводил конкртное расхождение по одной операции. Какие сведения необходимо уточнить для Вас?
Admin
 
23 января 2014 14:48
medved Пишет:
Какие сведения необходимо уточнить для Вас?
Дату не правильной операции, сумму в BYR, сумму в USD, курс к BYR который должен быть.
medved
23 января 2014 22:52
Admin Пишет:
medved Пишет:Какие сведения необходимо уточнить для Вас?Дату не правильной операции, сумму в BYR, сумму в USD, курс к BYR который должен быть.
1) 03.06.2011
Сумма в BYR - 1294680
Сумма в USD - 259,9
Курс к BYR - 4981

Сумма в дребеденьгах в USD - 322,53

2) 04.11.2011
Сумма в BYR - 2534980
Сумма в USD - 293
Курс к BYR - 8650

Сумма в дребеденьгах в USD - 429.93
Admin
 
24 января 2014 16:06
medved Пишет:
03.06.2011
У вас нет трат за указанные даты. Может быть вы смотрите под другим логином?
Пришлите скриншот, если можно.
medved
24 января 2014 18:57
Admin Пишет:
medved Пишет:03.06.2011 У вас нет трат за указанные даты. Может быть вы смотрите под другим логином? Пришлите скриншот, если можно.
Это из дохода.
Admin
 
24 января 2014 20:59
medved Пишет:
Это из дохода.
Нет вообще ни одной транзакции за эти даты, проверьте ещё раз внимательнее.
Если есть - убедитесь, что логин пользователя ваш и покажите скриншот, где видно эти транзакции.
medved
24 января 2014 21:19
Admin Пишет:
medved Пишет:Это из дохода.Нет вообще ни одной транзакции за эти даты, проверьте ещё раз внимательнее. Если есть - убедитесь, что логин пользователя ваш и покажите скриншот, где видно эти транзакции.
Извиняюсь. Логин medved это только для форума. Свой настоящий не хотелось бы писать прямо здесь на форуме.
Admin
 
24 января 2014 21:22
medved Пишет:
Свой настоящий не хотелось бы писать
Пришлите в обратную связь.
Admin
 
25 января 2014 12:22
medved Пишет:
03.06.2011
Сумма в BYR - 1294680
Сумма в USD - 259,9
Курс к BYR - 4981
Нашлось, посмотрели, всё вроде верно. По данным сайта openexchangerates.org курс на тот день был равен 4014.118571 BYR за 1 USD.

Уточните, цифра 4981 у вас откуда?
medved
25 января 2014 12:28
Admin Пишет:
medved Пишет:03.06.2011 Сумма в BYR - 1294680 Сумма в USD - 259,9 Курс к BYR - 4981Нашлось, посмотрели, всё вроде верно. По данным сайта openexchangerates.org курс на тот день был равен 4014.118571 BYR за 1 USD. Уточните, цифра 4981 у вас откуда?
Цифра с сайта нац банка РБ.
http://www.nbrb.by/statistics/rates/ratesDaily.asp?fromdate=2011-6-3

Я так понимаю, возможно это всё из-за полной чехарды с курсом у нас в тот год. Потому как за 2012 и 2013 все верно конвертирует можно сказать, хотя для примера в 2013 курс тоже уплыл с 8600 до 9500 за доллар.
Admin
 
25 января 2014 12:43
medved Пишет:
Цифра с сайта нац банка РБ.
И где же правда?
Может на самом деле давали 4014 за USD, а нац. банк пытался всем сказать, что 4981? :)
medved
25 января 2014 12:53
Admin Пишет:
medved Пишет:Цифра с сайта нац банка РБ.И где же правда? Может на самом деле давали 4014 за USD, а нац. банк пытался всем сказать, что 4981? :)
Правда в том, что по 4981 нигде купить нельзя было. А на черном рынке было по 8-10 тыс. не помню точно.

А вот вторая дата, которую я привел, 04.11.2011. Курс нац банка стал уже 8650. И тогда уже валюта появилась в свободной продаже.

Поэтому курс на openexchangerates.org за 2011 год точно не соответствует никакой действительности.
Admin
 
25 января 2014 13:01
medved Пишет:
Поэтому курс на openexchangerates.org за 2011 год точно не соответствует никакой действительности.
Да, проблема.
Вот вам и история курсов. Увы, лучшего источника данных чем openexchangerates мы не нашли.
medved
25 января 2014 16:39
Admin Пишет:
medved Пишет:Поэтому курс на openexchangerates.org за 2011 год точно не соответствует никакой действительности.Да, проблема. Вот вам и история курсов. Увы, лучшего источника данных чем openexchangerates мы не нашли.
Ладно. Что поделать. Это все равно лучше, чем то, как было раньше, когда вообще курс в 3 раза отличался. 2011 год все равно был проблемным в плане курсов официальных и реальных. А по другим годам всё стало работать корректно.

Ещё раз огромное спасибо за решение этой проблемы! Я как и обещал, купил премиум подписку и дальше буду с удовольствием пользоваться вашим сервисом.
Ilyan
26 января 2014 14:39
Спасибо за историю!

И за ILS :)

Правда, есть появился косяк в отчетах: суммы в отчете по категориям неверные.
А при раскрытии детализации, итоги внизу списка - верные.
Ilyan
26 января 2014 14:40
* раз уж теперь можно добавить практически любую валюту, добавьте, пожалуйста, EGP (египетский фунт)
Admin
 
26 января 2014 18:13
Ilyan Пишет:
суммы в отчете по категориям неверные.
Здравствуйте,
Опишите подробнее проблему, по шагам и если можно покажите скриншот, где видно проблему.
Ilyan
26 января 2014 20:51
Мне кажется, что проблема с валютами без кода:

Вот 3-in-1 скриншот:

1. Oтчет по категориям с ошибкой
2. Детальный отчет по тем же тратам, где видны валюты
3. Настройки валюты "₪ FP" (валюта "₪" - по умолчанию)
Ilyan
26 января 2014 20:51
https://drive.google.com/file/d/0By50NczJWxY2YXFhMHZfeUdWTVU/edit?usp=sharing
Admin
 
26 января 2014 21:16
Ilyan Пишет:
Мне кажется, что проблема с валютами без кода
Да, вы указали "Учитывать историю курсов", но отчёт включает в себя операции в валюте, для которой нет истории курсов. Поэтому они "выкидываются" из отчёта.

Это всё ограничения текущей реализации истории курсов, дополнили описание в подсказке к полю "Валюта", в параметрах отчёта. Посмотрите.
Ilyan
26 января 2014 21:57
Admin Пишет:
дополнили описание в подсказке
Дополнили описание?!
Вы так говорите, как будто даже не собираетесь с ничего делать с этой проблемой.

И меня до 40% трат делается в валютах без истории - как теперь отчетами пользоваться?

А у других может "выкидывается" всего 1-5% трат и они этого даже не замечают...
Admin
 
26 января 2014 22:10
Ilyan Пишет:
как теперь отчетами пользоваться
Просто убрать галочку "Учитывать историю курсов".
  Сюда 1 2 3  Туда  
Чтобы отвечать на сообщения - зарегистрируйтесь и войдите в личный кабинет.