Давайте поговорим о некоторых лучших практиках здесь:
Во-первых, я бы порекомендовал вам хранить дату закрытия / открытия даты, как предполагается, как вы, похоже, храните ее, что подразумевает, что вы сохраняете "days_in_month_closed "в качестве параметра.Чтобы сэкономить некоторое время преобразования в будущем, убедитесь, что вы используете стандартную строку метки времени (целые числа unixtime должны помочь).
Далее вы должны использовать DATEDIFF()
.Если вы хотите увидеть количество дней между началом месяца и датой закрытой клиентской учетной записи, вы должны написать это
SELECT
DATEDIFF(day,
`account_closed_date`
CAST(CONCAT(YEAR(`account_closed_date),"-",MONTH(`account_closed_day`),"-01") AS date)
FROM `accounts_table`
Этот запрос вернет число дней в виде целого числа междупервый и ожидаемый день месяца.
Если бы вы хотели найти начало следующего месяца, вы бы сделали нечто подобное
SELECT
DATEDIFF(day,
`account_open_date`
DATEADD(MONTH, 1, CAST(CONCAT(YEAR(`account_open_date),"-",MONTH(`account_open_day`),"-01") AS date)))
FROM `accounts_table`
С этими вычисленными числами вы можете затем выполнитьсумму таблицы баланса и используйте ее в качестве знаменателя.
SELECT
(Select AVG(balance) From balances)/
DATEDIFF(day,
`account_open_date`
DATEADD(MONTH, 1, CAST(CONCAT(YEAR(`account_open_date),"-",MONTH(`account_open_day`),"-01") AS date)))
FROM `accounts_table` at
Join balances b on at.account_id = b.account_id;
Это, конечно, при условии, что вам нужно рассчитать среднее сальдо на счет в этом запросе.Хотя лучшей практикой будет вычисление двух чисел отдельно (т. Е. Одного как Total Balance in the month
и одного как days account was active in the month
для каждой учетной записи, а затем разделить их отдельно.
Для новой учетной записи вы хотите показатьесли баланс равнялся нулю каждый день месяца до этого, то вы просто поделили бы его на общее количество дней в месяце, которое вы можете найти с помощью DATEADD(DAY, -1, DATEADD(MONTH, 1, Date_you_need))
или с помощью функции Day(EOMONTH(date_you_needed))
, котораяверните целочисленное значение в диапазоне от 28 до 31. Однако это верно только для SQL Server 2012, который, кажется, позже, чем версия, которую вы отметили в вопросе.