Oracle沒(méi)得實(shí)質(zhì)性的函數(shù),日期型類(lèi)型多種多樣,得自己編自定義函數(shù)來(lái)檢測(cè)處理。
成都創(chuàng)新互聯(lián)公司專(zhuān)注于歙縣企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站制作。歙縣網(wǎng)站建設(shè)公司,為歙縣等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
使用TO_DATE函數(shù):
TO_DATE('20151012?10:20:30','yyyymmdd?hh24:mi:ss')
TO_DATE('20151012102030','yyyymmddhh24miss')
TO_DATE('20151012','yyyymmdd')
TO_DATE('2015-10-12','yyyy-mm-dd')
使用TO_DATE()函數(shù)去轉(zhuǎn)換和捕獲產(chǎn)生的例外,無(wú)例外就是合法的日期,返回正常碼;有例外的就是非法日期,在例外里面返回錯(cuò)誤碼,這樣就能準(zhǔn)確判斷日期。
以上四個(gè)日期轉(zhuǎn)換都是合法的。
用to_char函數(shù)即可。
如emp表中數(shù)據(jù)如下:
要查詢(xún)hiredate的日期為1981年1月1日到1981年5月1日之間的數(shù)據(jù),可用如下語(yǔ)句:
select?*?from?emp?where?to_char(hiredate,'yyyy-mm-dd')?between?'1981-01-01'?and?'1981-05-01';
查詢(xún)結(jié)果:
這里有一個(gè)簡(jiǎn)單判斷日期的方法。
其實(shí)日期看來(lái)很簡(jiǎn)單,但各國(guó)表示各不相同.
1/13/2005
2005.10.25
23-05-2005
等都是日期
這還不包括類(lèi)似20051225等方式
/*
最初由?jackywood?發(fā)布
個(gè)人寫(xiě)的一個(gè)判斷是否是正確日期字符串的函數(shù),?請(qǐng)大家點(diǎn)評(píng)
函數(shù)參數(shù)?str?:?需要轉(zhuǎn)換為日期的字符串,?fmt?:?日期格式,?nls?:?日期字符串的語(yǔ)言
返回值:?類(lèi)型為date,?如果字符串不符合轉(zhuǎn)換格式的要求或是非法的日期字符串,?返回值為null,?反之,?返回轉(zhuǎn)換后的date值
*/
CREATE?OR?REPLACE?FUNCTION?isdate(str?varchar2,?fmt?varchar2?default?null,?nls?varchar2?default?null)
RETURN?date
IS
v_date?date;
v_fmt?varchar2(100)?default?fmt;
v_nls?varchar2(100)?default?nls;
BEGIN
IF?fmt?IS?NULL?THEN
SELECT?value
INTO?v_fmt
FROM?v$nls_parameters
WHERE?parameter='NLS_DATE_FORMAT';
END?IF;
IF?nls?IS?NULL?THEN
SELECT?'NLS_DATE_LANGUAGE='''||value||''''
INTO?v_nls
FROM?v$nls_parameters
WHERE?parameter='NLS_DATE_LANGUAGE';
END?IF;
v_date?:=?to_date(str,?v_fmt,?v_nls);
RETURN?v_date;
EXCEPTION
WHEN?OTHERS?THEN
/*如果你希望看到報(bào)錯(cuò),?就把下面的注釋行打開(kāi)*/
--raise;
RETURN?NULL;
END;
/
oracle判斷連續(xù)幾個(gè)月為0的最大間隔時(shí)間,原數(shù)據(jù)包含記錄行生成的時(shí)間戳字段OP_TIME和一個(gè)自增序列中間可能不連續(xù)的單據(jù)編號(hào)?SWF_NUM,概括起來(lái)最大間隔時(shí)間為:相鄰兩條記錄的時(shí)間戳間隔不超過(guò)10分鐘。以下是具體的間隔時(shí)間操作方法:要求統(tǒng)計(jì)相鄰兩條記錄的時(shí)間戳間隔不超過(guò)10分鐘的最大連續(xù)記錄數(shù),整體思路是:篩選出結(jié)果集,處理結(jié)果集,對(duì)結(jié)果集中符合條件和不符合條件的記錄打上標(biāo)簽。
過(guò)濾掉符合條件的記錄,使用 ROW_NUMBER對(duì)查詢(xún)結(jié)果第二次排序編號(hào),第三次處理結(jié)果集:ROW_NUMBER=ROW_NUMBER1對(duì)第二次處理得到的結(jié)果集自關(guān)聯(lián)。
同時(shí),通過(guò) ROW_NUMBER() 對(duì)結(jié)果集排序編號(hào),第二次處理結(jié)果集:對(duì)處理好的結(jié)果集通過(guò) ROWNUMBER=ROW_NUMBER1自關(guān)聯(lián)。
在查詢(xún)結(jié)果中將第一次的排序編號(hào)相減,差值-1就是連續(xù)記錄數(shù),對(duì)上述結(jié)果分組取最大值,得到最大連續(xù)記錄數(shù)。
現(xiàn)在用ROWNUMBER對(duì)篩選好的源數(shù)據(jù)排序,自關(guān)聯(lián)比較相鄰記錄的時(shí)間差,對(duì)符合要求的記錄通過(guò)ROW_NUMBER在排序,得到的結(jié)果通過(guò)第二次的ROW_NUMBER值自關(guān)聯(lián)。
在查詢(xún)結(jié)果中用第一次的ROW_NUMBER值求差,差值就是符合條件的連續(xù)記錄數(shù),分組后取最大值,得到結(jié)果。
oracle中有“判定字符串是否符合日期格式”的函數(shù),解決方法如下:
1、首先除了sysdate函數(shù)外oracle中還包含其它日期函數(shù),如add_months(日期,數(shù)字)在指定的日期上加入指定的月數(shù),求出新的日期。
2、除此之外還有next_day(日期,星期一)函數(shù),計(jì)算當(dāng)前日期的下個(gè)星期一時(shí)間。
3、還有l(wèi)ast_day(日期),用來(lái)求出指定日期所在月份的最后一天。
4、還有另外一個(gè)months_between(日期,指定日期),可以計(jì)算出兩個(gè)日期相差的月數(shù)。
5、如果給出的指定日期是字符串,在計(jì)算的時(shí)候就需要先將字符串進(jìn)行轉(zhuǎn)換成日期然后再進(jìn)行計(jì)算,使用to_date(日期,'格式'),就完成了。