1

2 つの日付 (startDate と endDate) をパラメーターとして受け取る関数を mySQL に記述しようとしています。次に、各月の日数を計算します。

データベースには、各月と年の目標収益値を取得した targetRevenue テーブルが含まれています。

id  month   year  targetRev
25    1       2012    1000.00
26    2       2012    5000.00
27    3       2012    8000.00

この関数は、その月の日数に基づいてその月の収益を見つけ、合計を返します。

例 : startDate : 2012-01-19 endDate : 2012-03-24 関数は [targetRev(1 月の 19 日間) + targetRev(2 月の 29 日間) + targetRev(3 月の 24 日間)] を返します。

私は mysql で関数を書くのは初めてなので、始めるための少しの助けが非常に役に立ちます。前もって感謝します!

4

3 に答える 3

2

monthおよび列の代わりに、テーブルyear内の各レコードの月を、各月の最初の日を含む列で表した場合:targetRevenueDATE

ALTER TABLE targetRevenue
  ADD COLUMN first DATE;

UPDATE targetRevenue
  SET first = STR_TO_DATE(CONCAT_WS('-', year, month, 1), '%Y-%c-%e');

ALTER TABLE targetRevenue
  DROP COLUMN year,
  DROP COLUMN month;

次に、プロジェクトの合計目標収益を取得できます (開始日と終了日の両方が含まれていると仮定します)。

-- calculate the summation of
SELECT SUM(CONVERT(

         -- number of project days in month...
         GREATEST(0,
           -- ...is calculated as the difference between...
           DATEDIFF(
             -- ...the last day of the project in this month...
                LEAST('2012-03-24', LAST_DAY(first)),
             -- ...and the first day of the project in this month...
             GREATEST('2012-01-19', first)
           )
           -- ...plus one because first and last project days were inclusive
           + 1
         )

         -- multiply by the target revenue for this month
         * targetRev

         -- divide by the number of days in the month
         / DAY(LAST_DAY(first)),

         -- convert result to fixed-point format, to two d.p.
         DECIMAL(11,2)

       )) AS total

FROM   targetRevenue

-- only perform for months in which the project was active
WHERE  '2012-01-19' <= LAST_DAY(first) AND first <= '2012-03-24'

sqlfiddleで参照してください。

スキーマを変更できない場合は、への参照をfirst、その列が上記で更新された値に置き換えることができます。

于 2012-08-29T12:32:01.657 に答える
0

このクエリを次のように使用します

SELECT   SUM(targetRev), MONTH(date_column) as mo
from     your_table
WHERE    date_column BETWEEN your_startDate AND your_endDate
GROUP BY mo;

これにより、各月の総収益の結果が得られます (このロジックのように使用します)

2つの異なる年である場合は、次のように使用できます

concat(year(date_column),month(date_column)) as mo
于 2012-08-29T12:56:33.180 に答える
0

SUM()これには、次のような関数を使用できます。

SELECT SUM(targetRev) from your_table
WHERE  date_column BETWEEN your_startDate_column AND your_endDate_column;

毎月の日を計算する必要はありません..

于 2012-08-29T11:57:33.457 に答える