1. 概述
1.1 預期效果
當數據庫中某張表有時間字段,且幾乎每分每秒都會有一條數據生成,爲減少報表顯示數據量,我們可以通過時間間隔來篩選數據,僅顯示部分數據。
例如:在 starttime 和 endtime 裏面輸入時間查詢範圍,在 number 裏面輸入間隔數 3,按 3 秒時間間隔篩選數據,效果如下圖所示:
1.2 實現思路
1)在 SQL 查詢中添加數據集參數,通過參數面板中控件給數參數賦值,SQL 根據傳遞的參數查出符合條件的數據。
2)給單元格添加條件屬性,通過隐藏單元格的方式顯示需要顯示的數據。
2. MySQL 數據庫示例
不同的數據庫,SQL 語句會有所不同,下面以 MySQL 數據庫爲例進行講解。假設已經存在數據庫表 datetest,其中每隔 1 秒就會有一筆數據,如下圖所示:
2.1 新建數據集
新建模板,新建數據集 ds1,如下圖所示:
SQL 語句爲:
SELECT *,timestampdiff(SECOND,date_format(datets, '%Y-%m-%d'),date_format(datets, '%Y-%m-%d %H:%i:%s')) % ${number} as jg
FROM
datetest
where
1=1
${if(len(starttime)==0,"","and date_format(datets,'%Y-%m-%d %H:%i:%s') >='"+ starttime +"'")}
${if(len(endtime)==0,"","and date_format(datets,'%Y-%m-%d %H:%i:%s') <='"+ endtime +"'")}
注:數據庫中日期存儲爲日期格式或字符串格式,SQL 語句的寫法會有不同,可根據實際場景調整。
SQL 語句說明:
1)SQL 語句中有 3 個數據集參數,分别是 number,starttime,endtime。其中 number 用來傳遞篩選間隔數,默認值設置爲 1,starttime 用來傳遞開始時間,endtime 用來傳遞結束時間,将會對應參數面板上的文本控件框和時間篩選框。
2)MySQL 中,timestampdiff 函數用於計算兩個時間的指定單位的時間差,參數可以是年、季度、月、日、時、分、秒等。date_format 函數用於以不同的格式顯示日期/時間數據。
3)% 爲取餘函數,通過對時間差取餘的方式,通過對時間差取餘,實現按一定時間間隔抽取數據的功能。
2.2 設計模板樣式
1)将數 ds1 據集字段依次拖入單元格 A1、B1、C1單元格中,并設置單元格樣式,如下圖所示:
2)點擊 C2 單元格,爲其添加條件屬性,内容爲:當 C2 值不爲 0 時,設改該行的行高爲 0,即隐藏當前行,如下圖所示:
2.3 設置參數控件
點擊「參數面板」,添加參數控件後設置控件屬性,其中 starttime,endtime 爲日期控件,number爲文本控件。如下圖所示:
2.4 預覽效果
保存模板後,點擊「分頁預覽」,輸入開始時間、結束時間、間隔數,查詢後結果如 1.1 節預期效果所示。
3. 其他數據庫 SQL 示例
3.1 SQL Server 數據庫
SELECT *,datediff(s,convert(varchar(100),datets,111),convert(varchar(100),datets,120)) % ${number} AS jg
FROM
dbo.datetest
WHERE 1 = 1
${IF(len(starttime) == 0,"","and CONVERT(varchar(100),datets,120)>='" + starttime + "'")}
${IF(len(endtime) == 0,"","and CONVERT(varchar(100),datets,120)<='" + endtime + "'") }
注:數據庫中日期存儲爲日期格式或字符串格式,SQL 語句的寫法會有不同,可根據實際場景調整。
SQL 語句說明:
1)SQL 語句中有 3 個數據集參數,分别是 number,starttime,endtime。其中 number 用來傳遞篩選間隔數,默認值設置爲 1,starttime 用來傳遞開始時間,endtime 用來傳遞結束時間。
2)SQL Server 中,datediff 函數返回兩個日期之間的時間,參數可以是年、季度、月、日、時、分、秒等。CONVERT() 函數是把日期轉換爲新數據類型的通用函數,也可以顯示不同的格式的日期。
3)%爲取餘函數,通過對時間差取餘,實現按一定時間間隔抽取數據的功能。
3.2 Oracle 數據庫
SELECT *,to_char(datets,'yyyy-mm-dd hh24:mi:ss'),mod((datets - to_date(to_char(datets, 'yyyy-mm-dd'),'yyyy-mm-dd'))
* 24 * 60 * 60,${number}) AS jg
from dbo.datetest
where 1=1
${IF(len(starttime) == 0,"","and to_char(datets,'yyyy-mm-dd')>='" + starttime + "'")}
${IF(len(starttime) == 0,"","and to_char(datets,'yyyy-mm-dd')<='" + endtime + "'") }
注:數據庫中日期存儲爲日期格式或字符串格式,SQL 語句的寫法會有不同,可根據實際場景調整。
SQL 語句說明:
1)SQL 語句中有 3 個數據集參數,分别是 number,starttime,endtime。其中 number 用來傳遞篩選間隔數,默認值設置爲 1,starttime 用來傳遞開始時間,endtime 用來傳遞結束時間。
2)SQL Server 中,to_date 函數将字符類型按一定格式轉換爲日期類型,to_char 函數将日期類型按一定格式轉換爲字符類型。上述SQL 中datets-to_date(to_char(datets, 'yyyy-mm-dd'),'yyyy-mm-dd') 返回天數,所以通過 * 24 * 60 * 60 的方式得到秒數。
3)mod 爲取餘函數,通過對時間差取餘,實現按一定時間間隔抽取數據的功能。