求給定的起始和結束字串中間的時間字串集合

2021-07-30 04:05:28 字數 2791 閱讀 6486

如題,在資料量比較大的表中,我們常常需要按時間(年、月或日)分表,加上乙個日期的字串字尾。而這種情形下,當使用者給定了起始和結束的時間字串時,我們就需要根據這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...