如题,在数据量比较大的表中,我们常常需要按时间(年、月或日)分表,加上一个日期的字符串后缀。而这种情形下,当用户给定了起始和结束的时间字符串时,我们就需要根据这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 List<String> getIntervalPeriods(String startDate, String endDate, String dimen) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(); int cVal = 0; if(StringUtils.equals(dimen, DAY_DIMEN)) { sdf = new SimpleDateFormat("yyyyMMdd"); cVal = Calendar.DATE; }else if(StringUtils.equals(dimen, MONTH_DIMEN)) { sdf = new SimpleDateFormat("yyyyMM"); cVal = Calendar.MONTH; }else if(StringUtils.equals(dimen, YEAR_DIMEN)) { sdf = new SimpleDateFormat("yyyy"); cVal = Calendar.YEAR; } 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); List<String> dates = new ArrayList<String>(); dates.add(startDate); while(c_begin.before(c_end)) { c_begin.add(cVal, 1); String dateStr = sdf.format(c_begin.getTime()); dates.add(dateStr); } // dates.add(endDate); return dates; }
我们使用main方法测试一番:
1.测试"天"
List<String> strs = 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.测试"月"
List<String> strs = 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.测试"年"
List<String> strs = 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即可)。而这常常应用在跨同类型的、按时间划分(时间作为字符串)
的表查询中。时间字符串的格式依实际情况而定~
相关推荐
总结来说,解决“求字符串中出现相同且长度最长字符串”的问题,我们可以运用滑动窗口、哈希映射或动态规划等技术。在实际编程中,应根据数据规模和性能要求选择合适的方法。对于给定的示例字符串,最终输出应为...
首先,我们要理解这个问题的核心:给定一个起始字符串(startString)和一个结束字符串(endString),我们需要从原始字符串(sourceString)中移除这两个字符串之间的所有内容,但保留起始和结束字符串本身。在C#中...
根据给定的信息,本文将详细解释两个用于C语言中字符串截取的方法:`subStringByIndex` 和 `subStringByPointer`。这两个函数都属于自定义实现,它们提供了灵活且实用的功能来帮助开发者轻松地从一个字符串中提取所...
根据给定的信息,我们需要实现一个C语言函数`void fun(char *s,char *t,char *p)`,该函数的功能是:将未在字符串`s`中出现、而在字符串`t`中出现的字符形成一个新的字符串并存储在指针`p`指向的空间内。新字符串中...
获取指定位置指定大小的子串是指从一个给定的字符串中,根据指定的起始位置和结束位置,获取一个子串。 在实现该功能时,我们需要使用到字符串处理函数,例如strlen、strcpy、memset等。这些函数提供了基本的字符串...
根据给定的信息,本文将详细解释如何在SQL中实现截取用特定字符分割的字符串中的第n个子字符串。此需求通常应用于数据处理与分析场景中,尤其在处理半结构化或非结构化的文本数据时非常有用。 ### 核心知识点解析 ...
在数据库管理和数据处理领域中,经常需要对存储在字段中的字符串进行处理,特别是当这些字符串包含了多个值时,通过分隔符将其分割成独立的部分是常见的需求之一。本篇文章将详细介绍如何利用SQL语言实现这一功能,...
它要求我们从一个给定的字符串中找到最长的一段连续的数字序列。这个问题涉及到字符串遍历、字符判断以及动态规划或滑动窗口等算法技巧。 首先,我们要明确问题的关键在于如何识别和提取数字串。在C语言中,我们...
给定字符串A和两个索引n和m,我们从A的第n个字符开始到第m个字符(不包括m)截取子串。这可以通过创建一个新的字符串,然后遍历原字符串的指定区间并将字符复制到新字符串中来完成。 4. **字符串的比较**: 判断...
字符串的排列是指从给定的字符集合中选取字符,并按照不同的顺序排列它们,生成所有可能的不同序列。在这个问题中,我们需要对给定的字符串中的每个字符进行全排列。 首先,我们来理解字符串的基本概念。在C++中,...
2. 使用 substring() 方法:substring() 方法可以将字符串按照指定的起始索引和结束索引分割成子字符串。例如:`String substr = str.substring(0, 10);` 3. 使用 Pattern 和 Matcher 类:使用 Pattern 和 Matcher ...
根据给定的文件信息,我们可以总结出以下关于“求一个字符串中的连续出现次数最多的字串”的相关知识点: ### 一、问题定义与分析 #### 1.1 问题背景 在计算机科学中,字符串处理是常见且重要的任务之一。本问题是...
在IT领域,尤其是在数据库操作与字符串处理中,掌握如何定位并提取字符串中的特定字符或子串是一项基本且重要的技能。本文将围绕“取字符串中字符位置”这一主题展开,深入探讨在SQL Server 2000及后续版本如SQL ...
根据给定的信息,本文将详细解释如何在一个字符串中查找特定子串出现的次数,并通过提供的代码示例来进一步阐述这一过程。我们将从以下几个方面进行深入探讨: ### 1. 字符串与子串的基本概念 #### 1.1 字符串 在...
总结来说,"C++数据结构字符串及KMP匹配算法"是一个关于C++编程和字符串处理的主题,涵盖了自定义字符串类的设计和实现,以及在字符串匹配中应用KMP算法。通过理解和掌握这些知识,开发者可以更高效地处理字符串操作...
这个函数会在给定的起始位置和长度内,用新字符串替换原字符串的一部分。若要删除空格,我们可以设定起始位置为1,长度为1,同时新字符串为空,重复此过程直到找到所有空格。 4. **循环与条件语句**:为了遍历整个...
在IT领域,字符串处理是编程中的基础操作之一,特别是在文本分析、数据处理和算法设计中。本问题聚焦于一个核心概念:子串判断。我们来深入探讨如何确定一个字符串(B)是否为另一个字符串(A)的子串。 首先,我们...
根据给定文件的信息,我们可以详细地探讨一下在编程中如何实现“逐个替换字符串中的指定字符”的功能。这个过程涉及到字符串处理的基本概念和技术,对于初学者来说是非常实用的知识点。 ### 一、字符串与字符替换的...
根据给定的文件信息,本文将详细介绍如何在C#中实现从字符串中截取数字的方法。这种方法通过遍历字符串中的每个字符,判断其是否为数字或数字符号(如正负号),并将其添加到结果中。该方法适用于任何包含数字与非...
在编程领域,字符串处理是常见的任务之一,而寻找字符串中的最长回文子串是一个经典问题。回文是指正读反读都一样的字符串,比如“上海自来水来自海上”。本篇文章将探讨如何实现寻找一个字符串中最长回文子串的算法...