ホームページ  >  記事  >  バックエンド開発  >  PHP 組織密度に関する一貫性のないデータに関する一連の関連質問

PHP 組織密度に関する一貫性のないデータに関する一連の関連質問

WBOY
WBOYオリジナル
2016-06-13 13:34:06753ブラウズ

PHP 組織密度に関する一貫性のないデータに関する一連の問題について
私には能力が限られており、小さなプロジェクトに取り組んでいるときに問題が発生しました。お役に立てれば幸いです。

データベース cfg_hisdata テーブルは、デバイスの収集された履歴パラメータ情報を保存するために使用されます。TimeH (6 桁の年、月、日の保存に使用)、TimeL (6 桁の年、月、日の保存に使用) の 3 つのキー フィールドがあります。 -数字の時、分、秒)、ParamContent(デバイスパラメータの保存に使用)。

保存ルールは、1 時間ごとに保存することと、パラメーターが変更されたときにも保存することです (秒まで正確)。

つまり、私にとって、ライブラリから取得するデータ密度は均一ではありません。そして、クエリ日付 0 から 24 までのデータを分単位 (秒は無視できます) で整理し、フロント デスクに渡す必要があります。


私の以前の解決策はおおよそ次のとおりです

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->// 将得到的日期补全,并且计算出天数,用天数乘以1440*60得到秒数
    $dateStart  = 20120420;  // 查询起始日期
    $dateEnd    = 20120420;  // 查询截至日期
    $day=(strtotime($dateEnd)-strtotime($dateStart))/3600/24 + 1;  // 计算查询天数

    $ltime = date('YmdHis',  mktime(0, 0, 0, substr($dateStart, 4, 2), substr($dateStart, 6, 2), substr($dateStart, 0, 4)));  // 生成查询起始日期的0点0分

    for ($i = 0; $i < 1440*60*$day; $i++)  // 通过循环生成以秒为单位作value的数组,然后将其作为secArr数组的value
    {
        $fullTime[] = $ltime;
        $ltime = date('YmdHis', strtotime("$ltime + 1 seconds"));  // 时间+1秒
    }
    $secArr = array_fill_keys($fullTime, "");


上記はデータの精度が秒であるため、キーを構築しますは秒です。配列


PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
while($result_va = mysqli_fetch_assoc($query))
        {
            $temp_data = $result_va['ParamContent'];
            $temp_time = $result_va['TimeH'].$result_va['TimeL'];
            $secArr[$temp_time] = (float)$temp_data;
            
            if ($cache_d)  // 防止复写数组的起始位置
            {
                $secArr = array_fill($cache_t, (int)$temp_time - $cache_t, $cache_d);  // 用前一个有效值填补到当前有效值数组中的空值
            }
            
            // 将当前有效值以及时间作为填充值备用
            $cache_d = $temp_data;
            $cache_t = $temp_time; 
        }



の後に、つまりクエリ結果を走査するときに、その時間に従って以前に整理された秒を置きます。スタンプ配列では、次のレコードを走査するときに、前のレコードの値がそれらの間の空の値を埋めるために使用されます。


この配列が整理されたら、この第 2 レベルの配列を 60 間隔で走査し、数分で新しい配列に入れて、最後に出力する予定です。


しかし、私のアイデアは複雑すぎてサイクルが多すぎて、非効率すぎると感じます。
私は長い間開発に触れておらず、私のレベルは初心者レベルです。また、アドバイスをお願いします。よろしくお願いします

-----解決策-------- -------------
つまり、1 分ごとに取得されたデータは、その分に書き込まれた最後のデータになります。
物事は簡単になります:
クエリ文字列の書き込み
$sql =<<< SQL
SELECT * FROM table where TimeH=' $dateStart' and
timel in (select max (timel) from table where TimeH=' $dateStart' group by left(timel,4))
SQL;
わずかな変更を加えれば、数日にわたることもあります

読み込んだ後は、必要なのは分が連続しているかどうかを判断する
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。