Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:选择一个月';将数据划分为时隙_Php_Mysql_Database - Fatal编程技术网

Php MySQL:选择一个月';将数据划分为时隙

Php MySQL:选择一个月';将数据划分为时隙,php,mysql,database,Php,Mysql,Database,我有两张桌子 表1。时隙 CREATE TABLE `timeslots` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `TodName` varchar(50) DEFAULT NULL, `StartTime` time DEFAULT NULL, `EndTime` time DEFAULT NULL, `SiteId` int(11) DEFAULT NULL, PRIMARY KEY (`Id`) ) 表2。传

我有两张桌子

表1。时隙

CREATE TABLE `timeslots` (
   `Id` int(11) NOT NULL AUTO_INCREMENT,
   `TodName` varchar(50) DEFAULT NULL,
   `StartTime` time DEFAULT NULL,
   `EndTime` time DEFAULT NULL,
   `SiteId` int(11) DEFAULT NULL,
   PRIMARY KEY (`Id`)
) 
表2。传感器值

CREATE TABLE `sensorvalues` (
   `SiteID` int(11) NOT NULL DEFAULT '0',
   `MeterID` int(11) NOT NULL DEFAULT '0',
   `Time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
   `SensorValue` double DEFAULT NULL,
    PRIMARY KEY (`MeterID`,`Time`)
)
我必须得到最大传感器值减去最小传感器值,每月按时间段分组。也就是说,每天的工作时间分为三个时段。1.繁忙时间(上午6时至下午6时)2。正常时间(下午6点至11点)和下午3点。非高峰时间(晚上11点至早上6点)。我需要得到每个月分别为这些时间段的传感器值

我目前正在做的是分别查找每天的传感器值,然后像这样添加

select Max(sv.SensorValue)-min(sv.SensorValue) 
FROM sensorvalues sv 
Where sv.`Time` between '2014-01-01 06:00:00' and  '2014-01-01 17:59:59' and MeterID = 1 ; 

这需要很多时间,因为sensorvalues表会随着每分钟的数据进行更新,而且非常庞大。任何人都可以帮助我或提出建议。谢谢

也许在一个查询中这样做会有所帮助。如果您只需要按月汇总值,请执行以下操作:

SELECT (case when time(time) between '06:00:00' and '17:59:59' then 'peak'
             when time(time) between '18:00:00' and '22:59:59' then 'normal'
             else 'offpeak'
        end) as timegroup,
       Max(sv.SensorValue) - min(sv.SensorValue) 
FROM sensorvalues sv 
WHERE sv.`Time` BETWEEN '2014-01-01 00:00:00' AND '2014-01-31 23:59:59' AND MeterID = 1
GROUP BY timegroup;

为什么不在查询中创建分组,然后
groupby
it

SELECT MAX(sv.SensorVale) - MIN(sv.SensorValue)
    ,CAST(CASE 
        WHEN EXTRACT(HOUR FROM sv.`Time`) BETWEEN 6 AND 17 THEN 'Peak'
        WHEN EXTRACT(HOUR FROM sv.`Time`) BETWEEN 18 AND 22 THEN 'Normal'
        ELSE 'Off-Peak'
    END AS VARCHAR(8)) AS hourGroup
    ,EXTRACT(MONTH FROM sv.`Time`) AS monthGroup
    ,EXTRACT(YEAR FROM sv.`Time`) AS yearGroup
FROM sensorvalues AS sv
WHERE sv.MeterID = 1
GROUP BY hourGroup
    ,monthGroup
    ,yearGroup;
这将为您提供所需的分组,而无需进行大量额外的查询。我加入了以月份和年份为基础的小组,因为你在问题中提到了这些参数

如果您想更高效地进行触摸(我的意思是只有一点点,但它可能会根据您的记录集产生不同),您可以将其转换为搜索
案例
,而不是我上面所做的值
案例

SELECT MAX(sv.SensorVale) - MIN(sv.SensorValue)
    ,CAST(CASE EXTRACT(HOUR FROM sv.`Time`)
        WHEN 6 THEN 'Peak'
        WHEN 7 THEN 'Peak'
        WHEN 8 THEN 'Peak'
        WHEN 9 THEN 'Peak'
        WHEN 10 THEN 'Peak'
        WHEN 11 THEN 'Peak'
        WHEN 12 THEN 'Peak'
        WHEN 13 THEN 'Peak'
        WHEN 14 THEN 'Peak'
        WHEN 15 THEN 'Peak'
        WHEN 16 THEN 'Peak'
        WHEN 17 THEN 'Peak'
        WHEN 18 THEN 'Normal'
        WHEN 19 THEN 'Normal'
        WHEN 20 THEN 'Normal'
        WHEN 21 THEN 'Normal'
        WHEN 22 THEN 'Normal'
        ELSE 'Off-Peak'
    END AS VARCHAR(8)) AS hourGroup
    ,EXTRACT(MONTH FROM sv.`Time`) AS monthGroup
    ,EXTRACT(YEAR FROM sv.`Time`) AS yearGroup
FROM sensorvalues AS sv
WHERE sv.MeterID = 1
GROUP BY hourGroup
    ,monthGroup
    ,yearGroup;

一个更大的查询,但是
案例本身的性能更高。如果您的记录集很小,那么这将产生最小的影响,但是如果您正在处理数以千万计的记录,那么这将是一个最小的影响,因此我只是提供它作为替代方案。

请使用示例数据和所需结果编辑您的问题。谢谢您提供额外的建议。我得到的响应与这两个几乎相同。我使用了“END AS CHAR(8)”,因为在那里我在转换为“VARCHAR”时出错