1

我正在尝试在 mySQL 中编写一个函数,该函数将两个日期(startDate 和 endDate)作为参数。然后它计算每个月的天数。

该数据库包含一个 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和列:yeartargetRevenueDATE

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

为此,您可以使用以下SUM()功能:

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

你不需要计算每个月的天数..

于 2012-08-29T11:57:33.457 回答
0

像这样使用这个查询

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

这将给出每个月总收入的结果(像这样的逻辑使用)

如果是两个不同的年份,您可以使用

concat(year(date_column),month(date_column)) as mo
于 2012-08-29T12:56:33.180 回答