在Oracle和PHP中日期和时间的使用_第1页
在Oracle和PHP中日期和时间的使用_第2页
在Oracle和PHP中日期和时间的使用_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PHP OracleOracle PHP 组合?Oracle+PHP PHP Oracle “PHP Oracle 计算这两个日期之间的差”这样的问题。Oracle 中的日期和时间Oracle /时间值的数据类型:表示日期和时间的 DATEDATE钟和秒相对应的“组成部分”4712 1 月 1 9999 12 月 31日这一范围中的任何一天。Oracle9i TIMESTAMPDATESQL 标准。 它提供了更大的时间精度,支持多达九位的小数,同时还能够存储时区信息。Oracle9i INTERVAL类型,它支持存储时间差(如“两年零五个月”或“八个小时零四十五分钟”),并可以与 DATE或

2、TIMESTAMP进行加法运算以生成一个新的DATE/ TIMESTAMP值。本文主要介绍 DATE 类型,但适用于 DATE 的大部分功能也适用于 TIMESTAMP。 (有关TIMESTAMPINTERVALJonathan Gennick Oracle 的文章“Datetime Datatypes Add Precision”和“Finding the Time in Between”(这两篇文章均在 2002 年11 - 12 月刊中发表)。Oracle 如何存储 DATE。 对于 Oracle 中的 DATE 类型,首先要了解的是,它的内部表示形式使它可SELECT DATE类型,O

3、racle 将自动把它转换为可读字符串,但这并不是值的实际存储方法。使用 SYSDATE 返回 DATE 前日期和时间:SELECT SYSDATE FROM dual /* e.g. 25-JUL-05 */Oracle NLS_DATE_FORMAT的控制,可以根据每个会话进行更改(如下所示)一下内部表示形式:SELECTDUMP(SYSDATE)FROMdual/*e.g.Typ=13Len=8:213,7,7,25,23,7,15,0*/结果中由逗号分隔的值对应于 Oracle 存储日期和时间的每个部分(从世纪一直到秒)所使用的字节。此处有一个重要问题值得注意:在比较 DATE DAT

4、E 的所有组成部分(一直比较到秒)在某些情况下,您可能要根据不同的时间单位(如年、月或日)比较两个日期。 这种情况下,可以使用TRUNC 这样的函数对所比较的两个 DATE 请参阅下面的“日期运算”。如果您熟悉面向对象的编程,则也可将 DATE 类型看作是对象。 他们全都拥有属性(年、月、小时等) 和行为,如:SELECT SYSDATE - 7 FROM dual /* e.g. 18-JUL-05 */该示例返回七天前的日期。 其它的“行为”包括 DATE SORT BY、GROUPBY (BETWEEN) DATE 减去另一个 DATE 以获得整数的日期差(TIMESTAMP 时,将获得

5、 INTERVAL 类型)。在 DATE 类型和字符串之间进行转换。TO_DATE() 和 TO_CHAR() 函数用于在 Oracle DATE“对象”格式掩码和一个用于指定语言的可选字符串(Oracle 如何将匹配的字符串与 DATE 类型关联。 Oracle 数据库SQL 的“格式模型”中介绍了格式掩码。使用 TO_CHAR。 以下是一个简单示例,它再次使用了 SYSDATE 函数:SELECT TO_CHAR( SYSDATE, YYYY-MM-DD HH24:MI:SS ) FROM dual/* e.g. 2005-07-26 17:34:04 */详细了解一下该格式掩码,“YYY

6、Y”表示一个四位年份,“MM”表示一个两位月份,“DD”表示一个两位的月份中的日,“HH24”表示 24 小时制的小时,“MI”表示 0 和 59 之间的分钟,“SS”表示 0 和 59 之间的秒。注意,以下字符从格式掩码按原样传递到输出:/ - , . ; :其他字符串可以通过括在引号中进行“传递”:SELECTTO_CHAR(SYSDATE,ThetimeisnowHH24:MI:SSprecisely)dual/* e.g. The time is now 17:38:22 preciselyTO_CHARTIMESTAMP类型结合使用。使用 TO_DATE。 Oracle 可以使用与

7、TO_CHAR 相同的格式掩码将字符串分析为 DATE 类型。 假设有一个字符串 20050726173102:SELECT TO_DATE( 20050726173102, YYYYMMDDHH24MISS ) FROM dual或者,要转换“Jul 26, 2005 17:13:05”,我可以使用:SELECT TO_DATE(Jul 26, 2005 17:13:05, Mon DD, YYYY HH24:MI:SS) FROMdualTIMESTAMPTO_TIMESTAMP。更改默认的日期格式。 默认情况下,Oracle 根据 NLS_DATE_FORMAT 参数中定义的格式掩码显示

8、DATE 类型。 可以在如下所示的会话中更改此默认日期格式:ALTER SESSION SET NLS_DATE_FORMAT = YYYY-MM-DD HH24:MI:SS2005 7 26 6 6 DATE对象相加:SELECT TO_DATE( 20050726173102, YYYYMMDDHH24MISS ) + 6 FROM dual/* e.g. 2005-08-01 17:13:05 */18 个小时,需要日期的相应小数: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在处理月份或年份时,由于两者均不能用常数天数表示(注意具有不同天数的闰年和闰月),因此需要ADD_MONTHS 函数。 将 12 个月与某个日期相加:SELECTADD_MONTHS(TO_DATE(20050726173102,YYYYMMDDHH24MISS),12)FROM dual/* e.g. 2006-07-26 17:31:02 */注意: 要减去月数,请使用减号。L

10、AST_DAY 函数返回 DATE 类型的月份的最后一天:SELECT LAST_DAY( TO_DATE( 20050701, YYYYMMDD ) ) FROM dual/* e.g. 2005-07-31 00:00:00 */TRUNC函数根据提供的日期掩码(即第二个参数),对 DATEDATE较时需要从比较中消除秒和分钟这样的单位,可以使用该函数:SELECT TRUNC( TO_DATE( 20050726173102, YYYYMMDDHH24MISS ), DD )FROM dual/* e.g. 2005-07-26 00:00:00 */如果未提供日期掩码,TRUNC 将对

11、 DATE 向下取整到它所表示的日的起始。其他与日期相关的函数包括 MONTHS_BETWEEN(用于计算两个 DATE类型之间的月数的整数差)、NEXT_DAY(用于获取与某个字符串文字(例如,“MONDAY”)匹配的下一个星期几的 DATE类型)及 ROUND(类似于 TRUNC,但按就近取整原则返回最近 DATE)。Date SQL 语句下面是一些在 SQL 语句中使用 DATE 类型,使用“emp”(员工)表(Oracle 分)的示例。 “em”表的“hiredate”列使用 DATE 类型存储值。找到在两个日期之间被辞退的所有员工: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添加一个新员工: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 函数返回

13、的 INTERVAL 类型找到所有在公司的工作时间超过 15 年的员工:SELECT*FROMemp WHERESYSDATE - TO_YMINTERVAL(15-00) hiredatePHP 中的日期和时间可以在 PHP 手册的日期和时间函数部分中找到所有基于 UNIX 时间戳的可用函数列表。 此处将主要介绍 date() 和 mktime() 函数,它们通常是您使用最频繁的函数。 注意,PHP 5.1.x 版引入了其他与日期相关的功能,而此处的示例只局限于可以在较早的 4.3.x 和 5.0.x 版中执行的操作,但它们也向前兼容 PHP 5.1.x。PHP UNIX UNIX 全球统一

14、时间(格林尼治标准时间年1 月 1 日 00:00:00)之前或之后的秒数。要查看 UNIX 时间戳,只需打印 PHP 的 time() 函数的结果,该函数相当于 Oracle 的 SYSDATE:要加上或减去天、小时、分钟等单位,请将该单位转换为秒,然后将它直接应用于时间戳。使用月和年这样的单位执行计算需要 mktime() 函数(如下所示)。格式化 UNIX 时间戳。date() 函数用于格式化 UNIX 时间戳:PHP 手册对 date() 函数的掩码进行了详细介绍。 date() 无法识别的任何字符(如标点字符)将自动“传递”到输出。 可以用反斜线对可能被误认为是格式一部分的字符进行转

15、义,例如:生成“Tuesday the 26th of July”。PHP 的字符串类型和双引号部分。date() 函数还可用于某些计算:Which tells me:2008isaleapyear2012isaleapyear2016isaleapyear2020isaleapyear还要注意 gmdate()date()尼治标准时间 (UTC)。创建和操作 UNIX 时间戳。mktime() 函数用于根据表示日期各个部分的给定整数值生成某个日期的UNIX 时间戳。 可以将 mktime() 看作是与 Oracle 的 TO_DATE 函数等价的函数。例如:mktime() 函数负责在跨越界

16、限(如两个月之间的界限)时进行所需的调整:此处,尝试为 mktime() “July 77 37 日),August(8 月)要找到给定月份的最后一天,可以将后一个月以及一个零值用作该月的最后一天。例如:与 date() 函数一样,还有一个也调整为格林尼治标准时间的 gmmktime() 函数。PHP 中的日期和时间存在的问题。 UNIX 32 位主流 CPU UNIX 平台上表示一组最大值为 2038 1902 PEAR Date 库这一替换方案,该库尽管较慢但却很有用。另一个问题领域是本地化,date() 函数只支持英语星期日期和月份名。 如果只需支持少数几种语言,则会发现最简单的实用解决

17、方案是使用相关数组转换名称。PHP 的本地日期和时间函数。身为核心 PHP 开发人员之一的 Derick Rethans PHPTimeHandlingApacheCON2005大会中发表)概述。划清界限PHP Oracle 本部分介绍了几种方法,可帮助您做出明智的决策。 PHP UNIX 时间戳存在 32 TIMESTAMPOracle 完Web 应用程序(尤其是企业内部网应用程序)时间戳的范围通常超出了应用程序将处理的数据类型的PHP 的日期时间函数不会引起问题。日期存储。 下面介绍一些有关日期和时间存储方面的问题。对于某些数据库(如 PHP5 的内置 UNIX Oracle DATETI

18、MESTAMP用作列类型来SELECT基于 DATETIMESTAMPSQL*Plus 这样的工具能够以为用户可理解的形式显示日期。Oracle 的日期格式化功能的意见(从分层体系结构的角度考虑)的数据存储层中对输出进行格式化是一个“糟糕的实践”,这应该是表示层完成的工作。如果您遇到一种不常见的情况 - John Lim ADOdb - 供的“编写可移植 SQL ”的“数据类型”部分。更为常见的情况是,你将基于单个数据库进行开发,因此供应商抽象不会成为问题。 您应该考虑让 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 时间戳。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+,因为它使用新的 OCI 名:DATEUNIX 时间戳: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等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论