如題,在資料量比較大的表中,我們常常需要按時間(年、月或日)分表,加上乙個日期的字串字尾。而這種情形下,當使用者給定了起始和結束的時間字串時,我們就需要根據這2個字串
判斷中間到底跨越了幾張同型別的按時間作為字尾的表。。
通常,用union all直接將多個表的查詢語句拼接在一條sql裡面,而非每張表都分別查詢一次,再把結果集給addall,這樣造成跟db的多次互動,影響效率,不太建議……
跨表查詢的sql拼接思想:
1)先判斷起始和結束字串代表的時間是不是在同一張表,若是,sql裡面不用union all操作,一張表的時間between 起始時間and結束時間 即可;
2)若不是同一張表,判斷起始和結束之間隔了幾張按時間命名的同型別表,sql裡迴圈拼接union all,並只需在起始表裡的時間大於等於起始字串;結束表的時間小於等於結束字串;中間
拼接的幾張表不需要時間過濾;但結束表的也需要union all;
3)每張表的select語句都需用()圍起來,再union all成一條sql語句。
問題的關鍵在於,如何搞定如題所示的需求~~ 以下為關鍵的測試**,特此記錄下,以便以後用得著:
public static string day_dimen = "day";
public static string month_dimen = "month";
public static string year_dimen = "year";
public static listgetintervalperiods(string startdate, string enddate, string dimen) throws parseexception else if(stringutils.equals(dimen, month_dimen)) else if(stringutils.equals(dimen, year_dimen))
calendar c_begin = calendar.getinstance();
calendar c_end = calendar.getinstance();
date d_begin = sdf.parse(startdate);
date d_end = sdf.parse(enddate);
c_begin.settime(d_begin);
c_end.settime(d_end);
listdates = new arraylist();
dates.add(startdate);
while(c_begin.before(c_end))
// dates.add(enddate);
return dates;
}
我們使用main方法測試一番:
1.測試"天"
liststrs = getintervalperiods("20151128","20151128",day_dimen);//測不跨天
system.out.println(strs);
strs = getintervalperiods("20150908","20150910",day_dimen);//測不跨月的天
system.out.println(strs);
strs = getintervalperiods("20151128","20151205",day_dimen);//測跨年跨月的天
system.out.println(strs);
執行結果:
[20151128]
[20150908, 20150909, 20150910]
[20151128, 20151129, 20151130, 20151201, 20151202, 20151203, 20151204, 20151205]
2.測試"月"
liststrs = getintervalperiods("201511","201603",month_dimen);//測跨年的月
system.out.println(strs);
strs = getintervalperiods("201509","201509",month_dimen);//測不跨月
system.out.println(strs);
strs = getintervalperiods("201509","201512",month_dimen);//測不跨年的月
system.out.println(strs);
執行結果:
[201511, 201512, 201601, 201602, 201603]
[201509]
[201509, 201510, 201511, 201512]
3.測試"年"
liststrs = getintervalperiods("2015","2018",year_dimen);//測跨年
system.out.println(strs);
strs = getintervalperiods("2015","2015",year_dimen);//測不跨年
system.out.println(strs);
執行結果:
[2015, 2016, 2017, 2018]
[2015]
測試成功,以上的工具**是十分有用滴,可以準確求出給定起始和結束時間字串中間的時間字串(如不需要頭尾,remove即可)。而這常常應用在跨同型別的、按時間劃分(時間作為字串)
的表查詢中。時間字串的格式依實際情況而定~
94 求字串的起始位置
問題描述 在程式設計中,對字串的處理是經常遇到的乙個問題。例如,將字串中所有的英文本母變成大寫,或者將乙個字串與另乙個字串連線構成乙個新的字串。由於此類的操作非常普遍,因此,在設計程式語言的時候,設計者就已經把這類操作的 寫好了,如果程式設計人員要使用這些 只需把該類 的標頭檔案包含到自己的程式中,...
求給定字串中的單詞數
1.題目 給定乙個字串,單詞以 或 t 間隔,返回字串中的單詞個數。如輸入 t ab tc drf e ffrt tert 輸出為6。2.解答 1 我的思路 遍歷字串,遇到非 或 t 則count 然後while迴圈跳過之後的所有非 或 t 如果是 或 t 然後while迴圈跳過所有的 或 t 這樣...
求給定字串中包含單詞的個數
字串只包含0 9十個數字,26個英文本母,英文標點符號,感嘆號,逗號,句號,連線符,問號,雙引號一共六個標點 符號。標點符號不算單詞,連線符連線的單詞算多個,例如 hello ni hao.這個算作三個單詞。例如 123q qqq 345,這個也算三個單詞。include include inclu...