Oracle中的Date、TimeStamp和Interval(上)
在Oracle中,Date和TimeStamp类型存储精度可变的固定日期时间。Intreval可以很容易地存储一个时间量,如“8个小时”或“30天”,将两个时间戳相减,就会得到一个时间间隔(Interval),例如,将8小时加到一个TimeStamp上,即得到一个新的TimeStamp。 Oracle 5
在Oracle中,Date和TimeStamp类型存储精度可变的固定日期时间。Intreval可以很容易地存储一个时间量,如“8个小时”或“30天”,将两个时间戳相减,就会得到一个时间间隔(Interval),例如,将8小时加到一个TimeStamp上,即得到一个新的TimeStamp。
Oracle 5中已经支持Date类型,TimeStamp和Interval在Oracle 9i Release 1中才被引入。因此,Date最为常见,但你应该在新应用中使用TimeStamp类型,因为:
1、TimeStamp支持小数秒,而Date不支持;
2、TimeStamp支持时区,Date不支持。
(一)Date类型Date类型是一个7字节的定宽日期/时间数据类型,它包含7个属性:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟、秒。Oracle使用一种内部格式来表示,它并不是保存20,12,10,31,12,01,00来表示2012年10月31日12:01:00,这个可以通过内置函数DUMP来查看:
Create table t (x date); insert into t(x) values (to_date('2012-11-24 12:01:00','YYYY-MM-dd HH24:mi:ss')); select x,dump(x,10) d from t;
查询结果:
世纪和年份字节,即(120,112)采用一种“加100”的表示法来存储。必须将其减去100才能得到正确的世纪和年份。这是为了支持BC和AD日期。
如果从世纪字节减100得到负数,表示BC日期,例如:
insert into t (x) values( to_date( '01-08-4712bc','dd-MM-yyyybc hh24:mi:ss' ) );
此时,会报一个错,“ORA-01856: 要求BC/B.C. 或AD/A.D.”。
修改为如下语句:
Insert into t (x) values(to_date('01-08-4712BC','dd-MM-YYYYBC','nls_date_language=American')); insert into t (x) values( to_date( '01-08-4710BC 12:01:13','dd-MM-yyyyBC hh24:mi:ss','nls_date_language=American') );
查看结果:
别担心,读出的世纪和年份是“虚”的,其实记录是正确的,以下语句即可。
select x, to_char(x,'dd-mm-yyyybc','nls_date_language=American') AS TrueDate,dump(x,10) d from t;
世纪字节是53,而53-100=-47,这才是我们插入的真实世纪。由于这是一个负数,我们知道它是一个BC日期。这种存储格式还允许日期以一种二进制方式自然地排序。由于4712BC小于4710BC,我们可以测试一下排序:
select x, to_char(x,'dd-mm-yyyybc','nls_date_language=American') AS TrueDate,dump(x,10) d from t order by TRUEDATE ASC;
接下来月份和日字节,自然存储,不作任何修改。小时、分、秒采用“加1”表示法存储,也就是各部分都减1,才能得到真实的时间。因此,午夜0点对应的日期字段表示为1,1,1
这种7字节格式能自然排序,可以采用一种二进制方式按从小到大或从大到小的顺序非常高效地进行排序。另外,这种结构允许很容易地进行截断,而无需把日期变成其他格式。即将尾部三个字节设置为1,1,1即可清除时间分量。
创建一个新表:
create table t ( what varchar2(10), x date ); insert into t (what, x) values ( 'downmoon', to_date( '25-11-2012 22:01:00', 'dd-MM-yyyy hh24:mi:ss' ) ); insert into t (what, x) select 'minute', trunc(x,'mi') from t union all select 'day', trunc(x,'dd') from t union all select 'month', trunc(x,'mm') from t union all select 'year', trunc(x,'y') from t / select what, x, dump(x,10) d from t;
结果:
要把这个日期截断,只取年份,数据库只要后5个字节置1,这是一个非常快速的操作。
而要向一个date增加时间或减去时间,请先遵循以下原则:
(1)使用NUMTODSINTERVAL增加时分秒;
(2)使用Date直接加数字增加天;
(3)使用ADD_MONTHS内置函数增加月和年;不建议使用NUMTOYMINTERVAL函数。因为前者会帮我们完成日期的舍入。
看示例:
alter session set nls_date_format='dd-MM-yyyy hh24:mi:ss'; select dt,add_months(dt,1) dt1,dt+NUMTOYMINTERVAL(1,'month') DT2 from (select to_date('29-02-2012','dd-MM-yyyy')dt from dual);
注意:ADD_MONTHS是添加自然月,而NUMTOYMINTERVAL是加到下个月的同一天,不管这一天是否有效,如果3月31日使用NUMTOYMINTERVAL加一个月,系统会报错。
因此,这句会正确执行:
select dt,add_months(dt,1) dt1 from (select to_date('31-03-2012','dd-MM-yyyy')dt from dual);
而这句会报错:指定月份的日期无效。
同理,向2012年2月29日增加1 年也会报错,因为不存在2013年2月29日。
另外一个应用就是如何得到两个日期之差,方法如下:
select numtoyminterval (trunc(months_between(dt2,dt1)),'month') years_months, numtodsinterval (dt2-add_months( dt1, trunc(months_between(dt2,dt1)) ), 'day' ) days_hours from (select to_date('2012-11-29 01:02:03','yyyy-MM-dd hh24:mi:ss') dt1, to_date('2014-03-15 11:22:33','yyyy-MM-dd hh24:mi:ss') dt2 from dual );
这个结果清楚地表明了两个日期相差1年、3个月、15天、10小时、20分、30秒。
下面一节我们将了解了下TimeStamp
助人等于自助! 3w@live.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

解決 Oracle 游標關閉問題的方法包括:使用 CLOSE 語句顯式關閉游標。在 FOR UPDATE 子句中聲明游標,使其在作用域結束後自動關閉。在 USING 子句中聲明游標,使其在關聯的 PL/SQL 變量關閉時自動關閉。使用異常處理確保在任何異常情況下關閉游標。使用連接池自動關閉游標。禁用自動提交,延遲游標關閉。

Oracle 中,FOR LOOP 循環可動態創建游標, 步驟為:1. 定義游標類型;2. 創建循環;3. 動態創建游標;4. 執行游標;5. 關閉游標。示例:可循環創建游標,顯示前 10 名員工姓名和工資。

要停止 Oracle 數據庫,請執行以下步驟:1. 連接到數據庫;2. 優雅關機數據庫(shutdown immediate);3. 完全關機數據庫(shutdown abort)。

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令

Oracle 日誌文件寫滿時,可採用以下解決方案:1)清理舊日誌文件;2)增加日誌文件大小;3)增加日誌文件組;4)設置自動日誌管理;5)重新初始化數據庫。在實施任何解決方案前,建議備份數據庫以防數據丟失。

可以通過使用 Oracle 的動態 SQL 來根據運行時輸入創建和執行 SQL 語句。步驟包括:準備一個空字符串變量來存儲動態生成的 SQL 語句。使用 EXECUTE IMMEDIATE 或 PREPARE 語句編譯和執行動態 SQL 語句。使用 bind 變量傳遞用戶輸入或其他動態值給動態 SQL。使用 EXECUTE IMMEDIATE 或 EXECUTE 執行動態 SQL 語句。

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。
