mysql時間操作函數和存儲過程


因為業務須要統計一批數據。用到關於mysql的時間操作函數和存儲過程,問題已經基本解決。把過程記錄下:

1. mysql的語句中不支持直接用循環。循環僅僅能在存儲過程中使用。

2. 寫為文件時,注意一些隱藏的字符,造成語法錯誤。本例中凝視中包括一些不可見字符。沒有找到。

3. 存儲過程中盡量多使用分好,切割開語句。

本例中 drop一句最初沒有寫。導致一直有錯。

4. 時間函數非常強大,能夠避免一些工作。http://www.cnblogs.com/ggjucheng/p/3352280.html

5. sql語句的優化非常重要。本例中僅攻克了問題,但數據量太大。存儲過程執行了非常久。期待有人能幫忙優化while語句中的優化。

以下貼代碼了:

--*將表test.transport20140901表中的數據依照每五分鍾一個間隔,統計各個路口的車流數量r
--*@start_time 起始時間 是整點時間的五分鍾間隔 如 2014-09-01 00:20:00
--*@end_time  終止時間  是整點的五分鍾間隔且大於start_time  如 2014-09-01 01:00:00
--*統計范圍包括起始時間,但不包括終止時間


delimiter $
drop procedure transport_status;
create procedure transport_status(start_time datetime,end_time datetime)
begin
        declare mid_start_time datetime;
        declare mid_end_time datetime;
        set mid_start_time=start_time;
        set mid_end_time=date_add(start_time, interval 5 minute);
        lab: while mid_start_time < end_time do
                insert into
                        test.transport_status(stamp,stamp_time,address,car_count)
                        (select
                                FLOOR(UNIX_TIMESTAMP(time)/300) as stmp,
                                date_format(mid_end_time,'%Y-%m-%d %H:%i:%s') as tm,
                                address,
                                count(address) as cnt
                        from
                        test.transport20140901
                        where
                        time > date_add(mid_start_time, interval -1 second)
                        and time < mid_end_time
                        group by address);
                set mid_start_time=date_add(mid_start_time, interval 5 minute);
                set mid_end_time=date_add(mid_end_time, interval 5 minute);
        end while lab;
end $
delimiter ;

call transport_status("2014-09-01 00:00:00","2014-09-2 00:00:00");




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM