① oracle計算N個工作日後的日期,過濾法
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
class MyCalander
{
private int year, month, day;
private Date startDay;
private Vector<Date> holidays;
public MyCalander()
{
startDay = new Date();
holidays = new Vector<Date>();
}
public void SetStartDay(String str)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
try {
startDay = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
}
public void SetHoliday(String str)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Date hd = new Date();
try {
hd = sdf.parse(str);
holidays.add(hd);
} catch (ParseException e) {
e.printStackTrace();
}
}
public void GetWorkDay(int n)
{
Calendar calendar = Calendar.getInstance();
Date cursorDay = startDay;
for(int i = 0; i < n; i++)
{
calendar.setTime(cursorDay);
do{
calendar.add(Calendar.DATE, 1);
cursorDay = calendar.getTime();
}while(calendar.get(Calendar.DAY_OF_WEEK) == 1 ||
calendar.get(Calendar.DAY_OF_WEEK) == 7 ||
holidays.contains(calendar.getTime()));
}
System.out.println("The day is :" + cursorDay);
}
}
public class test
{
public static void main(String [] args)
{
MyCalander myCalander = new MyCalander();
myCalander.SetStartDay("2013/2/25");
myCalander.SetHoliday("2013/3/11");
myCalander.SetHoliday("2013/3/8");
/************************************************
* connect database and set holidays here.
* for(...)
* myCalander.SetHoliday("yyyy/mm/dd");
***********************************************/
myCalander.GetWorkDay(10);
}
執行結果:
C:\>java test
The day is :Wed Mar 13 00:00:00 JST 2013
② oracle去除不合法日期
2個辦法:
1. 用游標,逐行進行to_date(datecol,'yyyymmdd'),如果出現exception,則日期格式錯誤。
2. 自己寫一個函數,輸入日回期字元串,答輸出1/0
判斷此格式的字元串是否是正確的日期,函數中可以:
a. 用to_date(datecol,'yyyymmdd'),如果出現exception,則日期格式錯誤,返回0;否則返回1。
或者
b. 自己進行日期的規則判斷:1年有12個月,各個月有多少天(閏年的2月需要特別處理)
然後update或者delete
比如 delete from table where f_date_validate(datecol) = 0;
③ oracle資料庫的過濾問題:如何過濾兩個表中相同的部分數據。比如說A表與B表都有記錄
試試下面的SQL語句是否符合你的需求: --A:
select XX_id
from tiantiantian
where sum_date=20110420
and XX_status < 30
and XX_type in (1009, 1008, 1003, 1011)
and XX_date > to_date(20110420, 'yyyymmdd')
and not exists(
select xx_id from dididi
where sum_date=20110420
and XX_status < 30
and XX_type in (1009, 1008, 1003, 1011)
and XX_date > to_date(20110420, 'yyyymmdd'));
--B:
select XX_id
from dididi
where sum_date=20110420
and XX_status < 30
and XX_type in (2001)
and XX_date > to_date(20110420, 'yyyymmdd')
and not exists(
select xx_id from tiantiantian
where sum_date=20110420
and XX_status < 30
and XX_type in (2001)
and XX_date > to_date(20110420, 'yyyymmdd'));
④ Oracle過濾掉無用的日期數據問題
日期強烈不建議使用字元串。。。。。
寫存儲過程可以搞搞
⑤ oracle怎麼計算兩個日期之間去除周末的天數
適用於SQL上下來文環境自
去掉的是周六/7,周日/1兩天周末
具體SQL如下、這是避免日期格式本地化的版本
selectcount(1)from(
selectto_char(TO_DATE('2016-12-24','yyyy-MM-dd')-level,'d')DOW
fromal
connectbylevel<=trunc(TO_DATE('2016-12-24','yyyy-MM-dd')-TO_DATE('2016-11-19','yyyy-MM-dd'))
)whereDOWnotin(7,1);
總結:
第一層查詢是通過connectbylevel生成兩個日期間的天數行
其中to_char(,'d')DOW欄位返回的是周幾的對應1~7的數字
第二層查詢就是去掉周六周日然後count天數
⑥ kettle 怎麼根據時間欄位進行過濾
今天使用kettle從mysql導數到oracle,發現只導了7行後,數據傳輸就終止了,查看日誌信息,報內錯如下容:
image
報:Couldn't get row from result set問題。
發現從這行開始這個時間欄位除了正常的時間數據以外還有NULL值,難道這類的值引起的錯誤,在查詢了相關資料後,才知道jdbc(默認行為)認為null或'0000-00-00'這樣的日期時間值是無效的。如果想避開這個問題,需要編輯jdbc的連接屬性,添加如下屬性值:
zeroDateTimeBehavior=convertToNull
image
設置之後導數成功進行。
image
所以,設計生產系統中的相關表時,默認值最好不要使用'0000-00-00'或null這樣的值。
⑦ Oracle Sql 查詢按時分過濾時間區段
SQL>CREATETABLET(KSSJDATE,JSSJDATE);
表已創建。
SQL>INSERTINTOTVALUES(to_date('09:30','HH24:MI'),to_date('11:30','HH24:MI'));
已創建1行。
SQL>COMMIT;
提交完成。
SQL>SELECTTO_CHAR(KSSJ+((ROWNUM-1)/48),'HH24:MI')KSSJ,TO_CHAR(KSSJ+(ROWNUM/48),'HH24:MI')JSSJ
2FROMTCONNECTBYROWNUM<=4;
KSSJJSSJ
----------
09:3010:00
10:0010:30
10:3011:00
11:0011:30
是你說的意思不?