SQL 获取指定月份的所有日期,SQL日期分页
package awu.demo;
import java.util.Date;
import java.util.List;
import awu.util.DateUtil;
public class SQLDemo {
/**
* @param year 年份
* @param month 月份
* @return 生成的sql 语句 如果是当前月份 则返回本月第一天到今天的所有日期
*/
public static String getDateSqlByYearMonth(int year, int month) {
Date sDate = DateUtil.getMonthFirstDay(DateUtil.getTargetDateOfMonth(year, month));
String sDateStr = DateUtil.getMonthFirstDayStr(new Date());
Date eDate = DateUtil.getMonthLastDay(DateUtil.getTargetDateOfMonth(year, month));
String dateStr = year+"-";
if(month<10){
dateStr+="0"+month;
}else{
dateStr+=month;
}
if(dateStr.equals(DateUtil.getCurDateOfYearmonth())){
eDate = new Date();
}
if((dateStr+"-01").equals(sDateStr)){
sDate = DateUtil.getLastMonthAfterDay();
}
String dateSql = createDateSql(eDate,sDate);
return dateSql;
}
/**
* 生成 sql 语句
*/
private static String createDateSql(Date endDate,Date startDate){
StringBuffer dateStr = new StringBuffer("select xyz.dt from (");
try {
List<String> list = DateUtil.getDaysBetweenStartDateAndEndDate(startDate, endDate);
for(int i=0;i<list.size();i++){
if(i==0){
dateStr.append("select "").append(list.get(i)).append("" as dt");
}else{
dateStr.append(" UNION ALL select "").append(list.get(i)).append("" as dt");
}
}
dateStr.append(" ) xyz");
} catch (Exception e) {
e.printStackTrace();
}
return dateStr.toString();
}
}
日期操作类
package awu.util;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 对日期的运算操作
*
*/
public class DateUtil {
public static final SimpleDateFormat SDF_MD = new SimpleDateFormat("MM-dd");
public static final SimpleDateFormat SDF_DATE = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat SDF_DATE_MONTH = new SimpleDateFormat("yyyy-MM");
public static final SimpleDateFormat SDF_SECOND_MILLISECOND = new SimpleDateFormat("SSsss");
/**
* 获取日期所在月份的第一天
* @param date
* @return
*/
public static <T extends Date> T getMonthFirstDay(final T date) {
if(date == null) {
return null;
}
final String dateStr = format(date, "yyyy-MM") + "-01";
final Long mill = parseDate(dateStr).getTime();
final T another = (T) date.clone();
another.setTime(mill);
return another;
}
/**
* 格式化日期
* @param date
* @return
*/
public static String getMonthFirstDayStr(Date date){
Date d = getMonthFirstDay(date);
return format(date, "yyyy-MM-dd");
}
/**
*获取日期所在月份的最后一天
* @param days
* @return
*/
public static <T extends Date> T getMonthLastDay(final T date){
if(date == null) {
return null;
}
final Calendar c = Calendar.getInstance();
c.setTime(date);
final String dateStr = format(date, "yyyy-MM") + "-" + c.getActualMaximum(Calendar.DAY_OF_MONTH);
final Long mill = parseDate(dateStr).getTime();
final T another = (T) date.clone();
another.setTime(mill);
return another;
}
/**
*
* @param days
* @return
*/获取当前日期
public static String getCurDateOfYearmonth(){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
return dateFormat.format(new Date());
}
/**
* 获取上个月最后一天的日期
*/
public static Date getLastMonthAfterDay(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DATE, -1);
return calendar.getTime();
}
}
测试
package awu.demo;
public class test {
public static void main(String[] args) {
System.out.println(SQLDemo.getDateSqlByYearMonth(2016, 9));
System.out.println(SQLDemo.getDateSqlByYearMonth(2015, 2));
}
}执行生成的sql结果如图
扩展
根据日期分页
/**
* @param from-当前页 从1开始 第一页从当前日期开始往前推rows天
* @param rows-每页数据条数
*/
public static String getDateSqlByForPage(int from, int rows) {
String dateSql = "";
Date eDate = new Date();
Date sDate = new Date();
try {
if(from == 1){
sDate = DateUtil.addDayByTarDate(new Date(),-rows);
}else{
sDate = DateUtil.addDayByTarDate(new Date(),-(from)*rows);
eDate = DateUtil.addDayByTarDate(sDate,rows);
}
dateSql = createDateSql(eDate,sDate);
} catch (Exception e) {
e.printStackTrace();
}
return dateSql;
}注意:这里DateUtil中的getDaysBetweenStartDateAndEndDate这个方法改动了一下,主要是这里取得二个日期间的集合是左右包含,按照分页要求所以改成左包含右不包含
具体如下:
/**
* 获取二个日期之间的的所有日期集合
* dwzhou@atman.com
* 2016年6月6日下午2:57:23
*/
public static List<String> getDaysBetweenStartDateAndEndDate(Date startDate,Date endDate){
List<String> list = new ArrayList<String>();
Calendar cd = Calendar.getInstance();
cd.setTime(startDate);
while(startDate.getTime()-endDate.getTime()<0){
startDate = cd.getTime();
cd.add(Calendar.DATE, 1);
list.add(SDF_DATE.format(startDate));
}
if(list!=null && list.size()>1){
list = list.subList(0, list.size()-1);
}
return list;
}执行一下生成的sql语句就可以看到效果了
public static void main(String[] args) {
System.out.println(getDateSqlByForPage(1,20));
System.out.println(getDateSqlByForPage(2,20));
System.out.println(getDateSqlByForPage(3,20));
System.out.println(getDateSqlByForPage(4,20));
}
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
