1. 程式人生 > >SQL 獲取指定月份的所有日期,SQL日期分頁

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這個方法改動了一下,主要是這裡取得二個日期間的集合是左右包含,按照分頁要求所以改成左包含右不包含

具體如下:

/**
     * 獲取二個日期之間的的所有日期集合
     * [email protected]
     * 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));
}

相關推薦

SQL 獲取指定月份所有日期SQL日期

package awu.demo; import java.util.Date; import java.util.List; import awu.util.DateUtil; public class SQLDemo { /** * @param year 年份 *

oracle sql 獲取本季度所有月份上季度所有月份

sele oracle div last code col 獲取 trunc rom 上季度所有月份: SELECT TO_CHAR(ADD_MONTHS(ADD_MONTHS(TRUNC(SYSDATE, ‘YYYY‘),A * 3),-ROWNUM),‘YYYYMM‘

sql獲取當前月份的前一月當前天的前一天當前年的前一年

ear date() class 獲取 月份 年份 mon sql dateadd 當前年份加減: SELECT CONVERT(varchar(12),DATEADD(year,1,GETDATE()),23) as year SELECT CONVERT(var

sql獲取表的所有字段及屬性

isn when sele length object obj 屬性 表名 inner 1 select 2 c.name as name,t.name as type 3 ,convert(bit,c.IsNullable) as is

sql獲取資料庫中所有的表名的方法:

1、oracle下:select table_name from all_tables; 2、MySQL下:select table_name from information_schema.tables where table_schema='csdb' and table_type='base

sql指定符號分割字串返回分割後指定索引的第幾個元素象陣列一樣方便

CREATE function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字串 @split varchar(10), --分隔符號 @index int --取第幾個元素 ) returns varchar(1024) as begin decla

獲取指定月份月初月末時間

$day=date("Y-m-d",time()); $day ="28-03-2015"; $day =date("Y-M-d",strtotime($day)); var_dump(time()); var_dump($day); $day2 = date("Y-m",

nodejs 獲取指定月份最後一天

moment nodejs months nodevar moment = require(‘moment‘);// 獲取指定月份最後一天moment(‘2017-12-24‘).endOf(‘month‘).format("YYYY-MM-DD")2017-07-31// 指定月份加九個月後的最

獲取應用版本號版本名稱包名AppName圖標是否是系統應用獲取手機中所有應用所有進程

pac version raw 是否 系統 app bsp agen nco PackageManager packageManager = getPackageManager(); PackageInfo packageInfo; = packageManager.get

Scala 獲取指定目錄所有文件

directory puts cto dir list rect tor array 單個 //獲取任意多個目錄下所有文件 def getFiles(inputs: File*): Seq[File] = { inputs.filter(_.isFile) ++

sql獲取隨機記錄(MYSQL,ACCESS,ORACLE,SQL Server)

在SQL Server中可以通過以下方式來取得隨機的前N條記錄select top N * from Table_Name order by newid()--newid()返回全域性(GUID)的 uniqueidentifier 型別的唯一值--N值是你要所取得的記錄數在Access中隨機抽取的

php獲取指定月份月初和月末的時間戳

獲取指定月份的開始時間戳和結束時間戳,只需傳入年月即可(2018-01,2018-1兩種格式都可以) $data['sel_time'] = '2018-11'; $data['begin_time'] = strtotime($data['sel_time']); //指定月份的開始時

獲取指定月份的天數

/**      * 獲取某個月的天數      * @param monthyear      * @return      */     public static int getDaysOfMonth(String monthyear) {         Simple

MyBatis的mapper層簡單的查詢sql語句報錯ORA-00923: 未找到要求的 FROM 關鍵字

<!-- 取得所有租賃合同列表 有分頁 --> <select id="selectListByAllWithPage" resultMap="RentResultMap"> select * from (select *,ROWNUM rn

獲取指定時區的天數小時數

給定一個當前時間對應的epoch,如何獲取北京時間(GMT+8)的天數天數指的是從1970年1月1日0點開始數的天數看上去很簡單,如果有epoch值t表示當前時間,直接用公式(t-0)/86400秒說明:1. 0表示1970年1月1日0點對應的秒數2. 86400秒錶示一天的

Python指令碼- 遞迴遍歷資料夾獲取指定副檔名檔案修改檔案內容

#USAGE: # 1、Choose file path # 2、Choose file type (according to extension name) # 3、Judging condition # 4、The content to insert # 5、Print file pat

mssql sqlserver獲取指定月份當月天數總和

CREATE FUNCTION dbo.fn_getMonthDayAll ---自定義函式名稱 ( @yyyyMM VARCHAR(20) ---指定輸入引數格式 4位年份2位月份 ) RETURNS INT ---函式返回值型別 AS BEGIN DECLARE @dayAll INT

sql server判斷表是否存在sql server判斷欄位是否存在

sql server判斷表是否存在 select COUNT(*) from  dbo.sysobjects where name='t_sys_para'; sql server判斷欄位是否存在 s

MySql實現查詢的SQLmysql實現查詢的sql語句

refs: http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要: MySQL資料庫實現分頁查詢的SQL語句寫法! 一:分頁需求: 客戶端通過傳遞start(頁碼),limit(每頁顯示的條數

FastJson的使用——複雜的JSON獲取指定的key-valueJSON與listobject的互轉

物件轉JSON String json = JSON.toJSONString(object); JSON轉物件 首先你需要構造一個物件實體類,且還需要攜帶一個無參構造器,比如: @Data public class User implements Seria