MySQL计算日期之间的字段

时间:2016-06-27 09:19:50

标签: mysql

我是MySQL的新手,我需要一个仅按月间隔计算的计算字段

例如:
我有date_created字段和daily_hours字段以及monthly_hours字段

我需要的是monthly_hours获得本月的总价值daily_hours,并随着月份的进展将其输入monthly_hours

希望解释清楚随意询问是否需要更多信息

先谢谢

CREATE TABLE `hours` (
`id` int(11) NOT NULL,
`date_created` datetime DEFAULT NULL,
`fleet_number` int(11) NOT NULL,
`daily_hours` varchar(50) NOT NULL,
`monthly_hours` varchar(50) NOT NULL,
`next_service_hours_km` varchar(50) NOT NULL,
`next_service_in` varchar(50) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

好,所以这是我的桌子

数据如下

id    |date_created        |fleet_number    |daily_hours    |monthly_hours
1     |2016-05-12 22:34:00 |7               |50             |????
2     |2016-05-12 22:34:00 |13              |200            |????
3     |2016-05-13 22:34:00 |7               |55             |????
4     |2016-05-13 22:34:00 |13              |210            |????

希望这更清楚

我需要的只是monthly_hours来计算每个fleet_number到目前为止的月份所做的小时数并将其插入到字段monthly_hours中,如果是新的月份则重新开始

id    |date_created        |fleet_number    |daily_hours    |monthly_hours
1     |2016-05-12 22:34:00 |7               |50             |0
2     |2016-05-12 22:34:00 |13              |200            |0
3     |2016-05-13 22:34:00 |7               |55             |5
4     |2016-05-13 22:34:00 |13              |220            |20
5     |2016-06-01 22:34:00 |7               |56             |0
6     |2016-06-01 22:34:00 |7               |60             |4

2 个答案:

答案 0 :(得分:0)

这是您想要的查询:

UPDATE `hours` SET `monthly_hours` = (`daily_hours` - (
    SELECT `initial_hours_per_month` FROM  (
    SELECT date_created, Month(`date_created`) as month ,year(`date_created`) as year,fleet_number,  min(daily_hours) as initial_hours_per_month FROM `hours` WHERE 1 group by fleet_number,Month(`date_created`),year(`date_created`)
    ) as `total_times`
    WHERE  `month` = Month(`hours`.`date_created`)
    AND `year` = Year(`hours`.`date_created`)
    AND `hours`.`fleet_number` = `total_times`.`fleet_number`
    ))

但我还可以推荐一种不同的方法,即创建每月总数,年份和fleet_number的视图,并在需要时选择相关行:

Create view Total_monthly_hours  as (SELECT Month(`date_created`) as month ,year(`date_created`) as year, fleet_number,  min(daily_hours) as initial_hours_per_month FROM `hours` WHERE 1 group by fleet_number, Month(`date_created`), year(`date_created`))

有了这个观点:

  1. 数据将始终自动更新(在上一个解决方案中,您每次都必须运行查询才能更新数字,因此大多数时间数据在上个月都不准确)

  2. 您不能保存重复数据。在以前的解决方案中,您可以为同月的每一行保留重复数据。

答案 1 :(得分:0)

感谢您的语法,但它只显示了我编辑代码的每日小时的最小值,以便给我我想要的内容

Create view Total_monthly_hours  as (
SELECT Month(`date_created`) as month ,
        year(`date_created`) as year, 
        fleet_number,  
        max(daily_hours) - min(daily_hours) as hours_per_month FROM `hours`
        WHERE 1 group by fleet_number, Month(`date_created`), year(`date_created`)
                                    ) 

它不漂亮,但它的工作方式就像我说你在正确的轨道上再次感谢语法帮助我弄清楚如何得到我需要的东西