我有一张表格,显示人们在一个日期范围内工作的时间(总是最多5天)。
是否可以按月分解日期范围的内容?
我的桌子(简化版)如下:

+---------------------+---------------------+--------------+
| datefrom            | dateto              | dailypayrate |
+---------------------+---------------------+--------------+
| 2014-05-05 00:00:00 | 2014-05-10 00:00:00 |        78.00 |
| 2014-04-07 00:00:00 | 2014-04-14 00:00:00 |        59.30 |
| 2014-02-10 00:00:00 | 2014-02-14 00:00:00 |        82.66 |
| 2014-04-28 00:00:00 | 2014-05-02 00:00:00 |        91.00 |<-- !
| 2014-01-28 00:00:00 | 2014-01-31 00:00:00 |        65.00 |
+---------------------+---------------------+--------------+

我想显示一个给定月份中每行的总工资,例如,对于4月份的第4行,它将显示273,即每日工资91乘以4月份工作的3天(即使该行显示5天)。

最佳答案

你可以在SQL中做你想做的事,但它不是很可爱。对于日期范围不包含月变化的行(其中month(timefrom)=month(timeto))很容易计数。就做一个草莓建议的DATEDIFF吧。

SELECT
        MONTH(datefrom) as month_number,
        DATEDIFF(dateto, datefrom) as days_worked,
        DATEDIFF(dateto, datefrom)*dailypayrate as salary
FROM my_table
WHERE MONTH(datefrom) = MONTH(dateto)

对于包含月变化的日期范围,我们需要将这些行分成两行:一行表示月(timefrom),另一行表示月(timeto)。这是一个月(时间),另一个只是一个减法。
SELECT
        MONTH(dateto) as month_number,
        MINUTE(dateto)/(60*24) + HOUR(dateto)/24 + DAY(dateto)-1 as days_worked,
        (MINUTE(dateto)/(60*24) + HOUR(dateto)/24 + DAY(dateto)-1)*dailypayrate as salary
FROM my_table
WHERE MONTH(datefrom) != MONTH(dateto)

然后我们结合这3个查询,按月份分组,它应该给出正确的数字。
http://sqlfiddle.com/#!2/120766/2

关于mysql - MySQL-查找给定月份中日期范围内的天数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23013643/

10-12 04:33