在Oracle和PHP中日期和時(shí)間的使用_第1頁(yè)
在Oracle和PHP中日期和時(shí)間的使用_第2頁(yè)
在Oracle和PHP中日期和時(shí)間的使用_第3頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、PHP OracleOracle PHP 組合?Oracle+PHP PHP Oracle “PHP Oracle 計(jì)算這兩個(gè)日期之間的差”這樣的問題。Oracle 中的日期和時(shí)間Oracle /時(shí)間值的數(shù)據(jù)類型:表示日期和時(shí)間的 DATEDATE鐘和秒相對(duì)應(yīng)的“組成部分”4712 1 月 1 9999 12 月 31日這一范圍中的任何一天。Oracle9i TIMESTAMPDATESQL 標(biāo)準(zhǔn)。 它提供了更大的時(shí)間精度,支持多達(dá)九位的小數(shù),同時(shí)還能夠存儲(chǔ)時(shí)區(qū)信息。Oracle9i INTERVAL類型,它支持存儲(chǔ)時(shí)間差(如“兩年零五個(gè)月”或“八個(gè)小時(shí)零四十五分鐘”),并可以與 DATE或

2、TIMESTAMP進(jìn)行加法運(yùn)算以生成一個(gè)新的DATE/ TIMESTAMP值。本文主要介紹 DATE 類型,但適用于 DATE 的大部分功能也適用于 TIMESTAMP。 (有關(guān)TIMESTAMPINTERVALJonathan Gennick Oracle 的文章“Datetime Datatypes Add Precision”和“Finding the Time in Between”(這兩篇文章均在 2002 年11 - 12 月刊中發(fā)表)。Oracle 如何存儲(chǔ) DATE。 對(duì)于 Oracle 中的 DATE 類型,首先要了解的是,它的內(nèi)部表示形式使它可SELECT DATE類型,O

3、racle 將自動(dòng)把它轉(zhuǎn)換為可讀字符串,但這并不是值的實(shí)際存儲(chǔ)方法。使用 SYSDATE 返回 DATE 前日期和時(shí)間:SELECT SYSDATE FROM dual /* e.g. 25-JUL-05 */Oracle NLS_DATE_FORMAT的控制,可以根據(jù)每個(gè)會(huì)話進(jìn)行更改(如下所示)一下內(nèi)部表示形式:SELECTDUMP(SYSDATE)FROMdual/*e.g.Typ=13Len=8:213,7,7,25,23,7,15,0*/結(jié)果中由逗號(hào)分隔的值對(duì)應(yīng)于 Oracle 存儲(chǔ)日期和時(shí)間的每個(gè)部分(從世紀(jì)一直到秒)所使用的字節(jié)。此處有一個(gè)重要問題值得注意:在比較 DATE DAT

4、E 的所有組成部分(一直比較到秒)在某些情況下,您可能要根據(jù)不同的時(shí)間單位(如年、月或日)比較兩個(gè)日期。 這種情況下,可以使用TRUNC 這樣的函數(shù)對(duì)所比較的兩個(gè) DATE 請(qǐng)參閱下面的“日期運(yùn)算”。如果您熟悉面向?qū)ο蟮木幊?,則也可將 DATE 類型看作是對(duì)象。 他們?nèi)紦碛袑傩裕辍⒃?、小時(shí)等) 和行為,如:SELECT SYSDATE - 7 FROM dual /* e.g. 18-JUL-05 */該示例返回七天前的日期。 其它的“行為”包括 DATE SORT BY、GROUPBY (BETWEEN) DATE 減去另一個(gè) DATE 以獲得整數(shù)的日期差(TIMESTAMP 時(shí),將獲得

5、 INTERVAL 類型)。在 DATE 類型和字符串之間進(jìn)行轉(zhuǎn)換。TO_DATE() 和 TO_CHAR() 函數(shù)用于在 Oracle DATE“對(duì)象”格式掩碼和一個(gè)用于指定語(yǔ)言的可選字符串(Oracle 如何將匹配的字符串與 DATE 類型關(guān)聯(lián)。 Oracle 數(shù)據(jù)庫(kù)SQL 的“格式模型”中介紹了格式掩碼。使用 TO_CHAR。 以下是一個(gè)簡(jiǎn)單示例,它再次使用了 SYSDATE 函數(shù):SELECT TO_CHAR( SYSDATE, YYYY-MM-DD HH24:MI:SS ) FROM dual/* e.g. 2005-07-26 17:34:04 */詳細(xì)了解一下該格式掩碼,“YYY

6、Y”表示一個(gè)四位年份,“MM”表示一個(gè)兩位月份,“DD”表示一個(gè)兩位的月份中的日,“HH24”表示 24 小時(shí)制的小時(shí),“MI”表示 0 和 59 之間的分鐘,“SS”表示 0 和 59 之間的秒。注意,以下字符從格式掩碼按原樣傳遞到輸出:/ - , . ; :其他字符串可以通過括在引號(hào)中進(jìn)行“傳遞”:SELECTTO_CHAR(SYSDATE,ThetimeisnowHH24:MI:SSprecisely)dual/* e.g. The time is now 17:38:22 preciselyTO_CHARTIMESTAMP類型結(jié)合使用。使用 TO_DATE。 Oracle 可以使用與

7、TO_CHAR 相同的格式掩碼將字符串分析為 DATE 類型。 假設(shè)有一個(gè)字符串 20050726173102:SELECT TO_DATE( 20050726173102, YYYYMMDDHH24MISS ) FROM dual或者,要轉(zhuǎn)換“Jul 26, 2005 17:13:05”,我可以使用:SELECT TO_DATE(Jul 26, 2005 17:13:05, Mon DD, YYYY HH24:MI:SS) FROMdualTIMESTAMPTO_TIMESTAMP。更改默認(rèn)的日期格式。 默認(rèn)情況下,Oracle 根據(jù) NLS_DATE_FORMAT 參數(shù)中定義的格式掩碼顯示

8、DATE 類型。 可以在如下所示的會(huì)話中更改此默認(rèn)日期格式:ALTER SESSION SET NLS_DATE_FORMAT = YYYY-MM-DD HH24:MI:SS2005 7 26 6 6 DATE對(duì)象相加:SELECT TO_DATE( 20050726173102, YYYYMMDDHH24MISS ) + 6 FROM dual/* e.g. 2005-08-01 17:13:05 */18 個(gè)小時(shí),需要日期的相應(yīng)小數(shù):SELECTTO_DATE(20050726173102,YYYYMMDDHH24MISS)-(1/24*18)FROMdual/* e.g. 2005-07

9、-25 23:31:02 */同樣,要加上 59 秒:SELECT TO_DATE( 20050726173102, YYYYMMDDHH24MISS ) + (1/(24*60*60)* 59) FROM dual在處理月份或年份時(shí),由于兩者均不能用常數(shù)天數(shù)表示(注意具有不同天數(shù)的閏年和閏月),因此需要ADD_MONTHS 函數(shù)。 將 12 個(gè)月與某個(gè)日期相加:SELECTADD_MONTHS(TO_DATE(20050726173102,YYYYMMDDHH24MISS),12)FROM dual/* e.g. 2006-07-26 17:31:02 */注意: 要減去月數(shù),請(qǐng)使用減號(hào)。L

10、AST_DAY 函數(shù)返回 DATE 類型的月份的最后一天:SELECT LAST_DAY( TO_DATE( 20050701, YYYYMMDD ) ) FROM dual/* e.g. 2005-07-31 00:00:00 */TRUNC函數(shù)根據(jù)提供的日期掩碼(即第二個(gè)參數(shù)),對(duì) DATEDATE較時(shí)需要從比較中消除秒和分鐘這樣的單位,可以使用該函數(shù):SELECT TRUNC( TO_DATE( 20050726173102, YYYYMMDDHH24MISS ), DD )FROM dual/* e.g. 2005-07-26 00:00:00 */如果未提供日期掩碼,TRUNC 將對(duì)

11、 DATE 向下取整到它所表示的日的起始。其他與日期相關(guān)的函數(shù)包括 MONTHS_BETWEEN(用于計(jì)算兩個(gè) DATE類型之間的月數(shù)的整數(shù)差)、NEXT_DAY(用于獲取與某個(gè)字符串文字(例如,“MONDAY”)匹配的下一個(gè)星期幾的 DATE類型)及 ROUND(類似于 TRUNC,但按就近取整原則返回最近 DATE)。Date SQL 語(yǔ)句下面是一些在 SQL 語(yǔ)句中使用 DATE 類型,使用“emp”(員工)表(Oracle 分)的示例。 “em”表的“hiredate”列使用 DATE 類型存儲(chǔ)值。找到在兩個(gè)日期之間被辭退的所有員工:SELECTename, TO_CHAR(hired

12、ate, ddth Mon, YYYY)FROMemp WHEREhiredate BETWEENTO_DATE(1980-01-01,YYYY-MM-DD)ANDTO_DATE(1985-01-01,YYYY-MM-DD)ORDER BYhiredateDESC添加一個(gè)新員工:INSERT INTO emp () VALUES(empno, ename, job, mgr,hiredate, sal, deptno8002, JOHNSON,ANALYST, 7566,TO_DATE(2005-07-22,YYYY-MM-DD), 3000,20)使用從 TO_YMINTERVAL 函數(shù)返回

13、的 INTERVAL 類型找到所有在公司的工作時(shí)間超過 15 年的員工:SELECT*FROMemp WHERESYSDATE - TO_YMINTERVAL(15-00) hiredatePHP 中的日期和時(shí)間可以在 PHP 手冊(cè)的日期和時(shí)間函數(shù)部分中找到所有基于 UNIX 時(shí)間戳的可用函數(shù)列表。 此處將主要介紹 date() 和 mktime() 函數(shù),它們通常是您使用最頻繁的函數(shù)。 注意,PHP 5.1.x 版引入了其他與日期相關(guān)的功能,而此處的示例只局限于可以在較早的 4.3.x 和 5.0.x 版中執(zhí)行的操作,但它們也向前兼容 PHP 5.1.x。PHP UNIX UNIX 全球統(tǒng)一

14、時(shí)間(格林尼治標(biāo)準(zhǔn)時(shí)間年1 月 1 日 00:00:00)之前或之后的秒數(shù)。要查看 UNIX 時(shí)間戳,只需打印 PHP 的 time() 函數(shù)的結(jié)果,該函數(shù)相當(dāng)于 Oracle 的 SYSDATE:要加上或減去天、小時(shí)、分鐘等單位,請(qǐng)將該單位轉(zhuǎn)換為秒,然后將它直接應(yīng)用于時(shí)間戳。使用月和年這樣的單位執(zhí)行計(jì)算需要 mktime() 函數(shù)(如下所示)。格式化 UNIX 時(shí)間戳。date() 函數(shù)用于格式化 UNIX 時(shí)間戳:PHP 手冊(cè)對(duì) date() 函數(shù)的掩碼進(jìn)行了詳細(xì)介紹。 date() 無法識(shí)別的任何字符(如標(biāo)點(diǎn)字符)將自動(dòng)“傳遞”到輸出。 可以用反斜線對(duì)可能被誤認(rèn)為是格式一部分的字符進(jìn)行轉(zhuǎn)

15、義,例如:生成“Tuesday the 26th of July”。PHP 的字符串類型和雙引號(hào)部分。date() 函數(shù)還可用于某些計(jì)算:Which tells me:2008isaleapyear2012isaleapyear2016isaleapyear2020isaleapyear還要注意 gmdate()date()尼治標(biāo)準(zhǔn)時(shí)間 (UTC)。創(chuàng)建和操作 UNIX 時(shí)間戳。mktime() 函數(shù)用于根據(jù)表示日期各個(gè)部分的給定整數(shù)值生成某個(gè)日期的UNIX 時(shí)間戳。 可以將 mktime() 看作是與 Oracle 的 TO_DATE 函數(shù)等價(jià)的函數(shù)。例如:mktime() 函數(shù)負(fù)責(zé)在跨越界

16、限(如兩個(gè)月之間的界限)時(shí)進(jìn)行所需的調(diào)整:此處,嘗試為 mktime() “July 77 37 日),August(8 月)要找到給定月份的最后一天,可以將后一個(gè)月以及一個(gè)零值用作該月的最后一天。例如:與 date() 函數(shù)一樣,還有一個(gè)也調(diào)整為格林尼治標(biāo)準(zhǔn)時(shí)間的 gmmktime() 函數(shù)。PHP 中的日期和時(shí)間存在的問題。 UNIX 32 位主流 CPU UNIX 平臺(tái)上表示一組最大值為 2038 1902 PEAR Date 庫(kù)這一替換方案,該庫(kù)盡管較慢但卻很有用。另一個(gè)問題領(lǐng)域是本地化,date() 函數(shù)只支持英語(yǔ)星期日期和月份名。 如果只需支持少數(shù)幾種語(yǔ)言,則會(huì)發(fā)現(xiàn)最簡(jiǎn)單的實(shí)用解決

17、方案是使用相關(guān)數(shù)組轉(zhuǎn)換名稱。PHP 的本地日期和時(shí)間函數(shù)。身為核心 PHP 開發(fā)人員之一的 Derick Rethans PHPTimeHandlingApacheCON2005大會(huì)中發(fā)表)概述。劃清界限PHP Oracle 本部分介紹了幾種方法,可幫助您做出明智的決策。 PHP UNIX 時(shí)間戳存在 32 TIMESTAMPOracle 完Web 應(yīng)用程序(尤其是企業(yè)內(nèi)部網(wǎng)應(yīng)用程序)時(shí)間戳的范圍通常超出了應(yīng)用程序?qū)⑻幚淼臄?shù)據(jù)類型的PHP 的日期時(shí)間函數(shù)不會(huì)引起問題。日期存儲(chǔ)。 下面介紹一些有關(guān)日期和時(shí)間存儲(chǔ)方面的問題。對(duì)于某些數(shù)據(jù)庫(kù)(如 PHP5 的內(nèi)置 UNIX Oracle DATETI

18、MESTAMP用作列類型來SELECT基于 DATETIMESTAMPSQL*Plus 這樣的工具能夠以為用戶可理解的形式顯示日期。Oracle 的日期格式化功能的意見(從分層體系結(jié)構(gòu)的角度考慮)的數(shù)據(jù)存儲(chǔ)層中對(duì)輸出進(jìn)行格式化是一個(gè)“糟糕的實(shí)踐”,這應(yīng)該是表示層完成的工作。如果您遇到一種不常見的情況 - John Lim ADOdb - 供的“編寫可移植 SQL ”的“數(shù)據(jù)類型”部分。更為常見的情況是,你將基于單個(gè)數(shù)據(jù)庫(kù)進(jìn)行開發(fā),因此供應(yīng)商抽象不會(huì)成為問題。 您應(yīng)該考慮讓 Oracle通過各種方式完日期的格式化,而不是嘗試在 PHP 中處理日期,如以下查詢所示:SELECTename,TO_C

19、HAR(hiredate, YYYY) AS hired_year, TO_CHAR(hiredate, YYYYMM) AS hired_month, TO_CHAR(hiredate, DD Mon, YYYY) AS hired_pretty,TO_CHAR(hiredate, DD Mon, YYYY, NLS_DATE_LANGUAGE=GERMAN) AShired_german FROMemp ORDER BYhiredate(或除此以外PHP date()(如下所示UNIX 時(shí)間戳。Oracle的某些格式掩碼(“Montdate() 代碼行。Oracle DATEUnix Or

20、acle DATEUNIX Oracle DATE類型:CREATE OR REPLACEFUNCTION unixts_to_date(unixts IN PLS_INTEGER) RETURN DATE IS/* Converts a UNIX timestamp into an Oracle DATE*/unix_epoch DATE := TO_DATE(19700101000000,YYYYMMDDHH24MISS);max_ts PLS_INTEGER := 2145916799; - 2938-12-31 23:59:59min_ts PLS_INTEGER := -211438

21、0800; - 1903-01-01 00:00:00oracle_date DATE;BEGINIF unixts max_ts THEN RAISE_APPLICATION_ERROR(-20901,UNIX timestamp too large for 32 bit limitELSESECOND); END IF;);ELSIF unixts min_ts THEN RAISE_APPLICATION_ERROR(-20901,UNIX timestamp too small for 32 bit limit ); oracle_date := unix_epoch + NUMTOD

22、SINTERVAL(unixts,RETURN (oracle_date);END;以下 PHP 腳本顯示了如何使用該方法。 注意,該腳本需要 PHP 5.x+,因?yàn)樗褂眯碌?OCI 名:DATEUNIX 時(shí)間戳:CREATE OR REPLACEFUNCTION date_to_unixts(oracle_date IN DATE) RETURN PLS_INTEGER IS/* Converts an Oracle DATE to a UNIX timestamp*/unix_epoch DATE := TO_DATE(19700101000000,YYYYMMDDHH24MISS);max_dateDATE:=TO_DATE(20380101000000,YYYYMMDDHH24MI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論