日期和時間的儲存與處理
關於日期和時間在資料庫中經常用到,下面總結了一些這方面的知識。
因為字符集對日期時間有影響,這個是我們首先要關注的,之前的文章中也簡單的提到了(http://blog.itpub.net/29876893/viewspace-1627370/)
SQL> select * from nls_session_parameters where rownum<4;
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_LANGUAGE
SIMPLIFIED CHINESE
NLS_TERRITORY
CHINA
NLS_CURRENCY
¥
此時該會話的字符集是SIMPLIFIED CHINESE,為了做實驗,改成英文:
SQL> alter session set NLS_LANGUAGE=AMERICAN;
Session altered.
SQL> select * from nls_session_parameters where rownum<4;
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_LANGUAGE
AMERICAN
NLS_TERRITORY
CHINA
NLS_CURRENCY
¥
如果讀過之前寫的文章,已經知道 Language:影響oracle訊息,校驗,日期命名
SQL> select sysdate from dual;
SYSDATE
------------------
09-MAY-15
因為字符集對日期時間有影響,這個是我們首先要關注的,之前的文章中也簡單的提到了(http://blog.itpub.net/29876893/viewspace-1627370/)
SQL> select * from nls_session_parameters where rownum<4;
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_LANGUAGE
SIMPLIFIED CHINESE
NLS_TERRITORY
CHINA
NLS_CURRENCY
¥
此時該會話的字符集是SIMPLIFIED CHINESE,為了做實驗,改成英文:
SQL> alter session set NLS_LANGUAGE=AMERICAN;
Session altered.
SQL> select * from nls_session_parameters where rownum<4;
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_LANGUAGE
AMERICAN
NLS_TERRITORY
CHINA
NLS_CURRENCY
¥
如果讀過之前寫的文章,已經知道 Language:影響oracle訊息,校驗,日期命名
SQL> select sysdate from dual;
SYSDATE
------------------
09-MAY-15
預設儲存在資料庫中的日期是以:DD-MON-YYYY,讀取預設是DD-MON-YY
我們可以使用關鍵字DATE,向資料庫中插入日期:
SQL> create table t(t date);
Table created.
SQL> insert into t values('09-MAY-15');
1 row created.
SQL> insert into t values(DATE '1994-8-25');
1 row created.
SQL> insert into t values(DATE '1994-08-20');
1 row created.
SQL> select * from t;
T
------------------
09-MAY-15
25-AUG-94
20-AUG-94
但是使用DATE關鍵字,此時日期必須使用ANSI標準日期格式:YYYY-MM-DD
我們可以用函式to_char(x[,format]):把x轉換成字串,並用後面提供的格式,下面我們可以把日期轉換成我們想要的格式:
SQL> select to_char(t,'DD-MON-YYYY') FROM t;
TO_CHAR(T,'DD-MON-YY
--------------------
09-MAY-2015
25-AUG-1994
20-AUG-1994
SQL> select to_char(t,'MON-DD-YYYY') FROM t;
TO_CHAR(T,'MON-DD-YY
--------------------
MAY-09-2015
AUG-25-1994
AUG-20-1994
SQL> select to_char(sysdate,'DD-MON-YYYY,HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'DD-MON-YYYY,
-----------------------------
09-MAY-2015,23:58:54
上面只是舉簡單的例子,關於時間格式化引數可以參考文件。
to_date(x[,format])將x轉換為DATE型別:
SQL> select to_date('MAY-6-2015') from dual;
select to_date('MAY-6-2015') from dual
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
SQL> select to_date('5-MAY-2015') from dual;
TO_DATE('5-MAY-201
------------------
05-MAY-15
我們可以使用關鍵字DATE,向資料庫中插入日期:
SQL> create table t(t date);
Table created.
SQL> insert into t values('09-MAY-15');
1 row created.
SQL> insert into t values(DATE '1994-8-25');
1 row created.
SQL> insert into t values(DATE '1994-08-20');
1 row created.
SQL> select * from t;
T
------------------
09-MAY-15
25-AUG-94
20-AUG-94
但是使用DATE關鍵字,此時日期必須使用ANSI標準日期格式:YYYY-MM-DD
我們可以用函式to_char(x[,format]):把x轉換成字串,並用後面提供的格式,下面我們可以把日期轉換成我們想要的格式:
SQL> select to_char(t,'DD-MON-YYYY') FROM t;
TO_CHAR(T,'DD-MON-YY
--------------------
09-MAY-2015
25-AUG-1994
20-AUG-1994
SQL> select to_char(t,'MON-DD-YYYY') FROM t;
TO_CHAR(T,'MON-DD-YY
--------------------
MAY-09-2015
AUG-25-1994
AUG-20-1994
SQL> select to_char(sysdate,'DD-MON-YYYY,HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'DD-MON-YYYY,
-----------------------------
09-MAY-2015,23:58:54
to_date(x[,format])將x轉換為DATE型別:
SQL> select to_date('MAY-6-2015') from dual;
select to_date('MAY-6-2015') from dual
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
SQL> select to_date('5-MAY-2015') from dual;
TO_DATE('5-MAY-201
------------------
05-MAY-15
注意日期的格式DD-MON-YYYY(DD-MON-YY)所以上面的查詢發生錯誤
SQL> select to_date('5-MAY-2015 9:50:45','DD-MON-YY HH24:MI:SS') FROM DUAL;
TO_DATE('5-MAY-201
------------------
05-MAY-15
SQL> select to_date('5-MAY-2015 9:50:45','DD-MON-YYYY HH24:MI:SS') FROM DUAL;
TO_DATE('5-MAY-201
------------------
05-MAY-15
SQL> select to_char(to_date('5-MAY-2015 9:50:45','DD-MON-YYYY HH24:MI:SS'),'MON-DD-YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(TO_DATE('5-M
--------------------
MAY-05-2015 09:50:45
SQL> select to_char(to_date('5-MAY-2015 9:50:45','DD-MM-YYYY HH24:MI:SS'),'MON-DD-YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(TO_DATE('5-MAY-20159:
-----------------------------
MAY-05-2015 09:50:45
SQL> select to_char(to_date('5-MAY-2015 9:50:45','DD-MM-YYYY HH24:MI:SS'),'MM-DD-YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(TO_DATE('5-
-------------------
05-05-2015 09:50:45
可以結合to_char和to_date,可以使用不同格式的時間值。
我們透過設定nls_date_format,指定日期格式,如果是全域性設定,在引數檔案中設定,也可以在session中設定啦:
SQL> show parameter nls_date
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_date_format string
nls_date_language string
SQL> show user;
USER is "HR"
SQL> alter session set nls_date_format='MON-DD-YYYY';
Session altered.
SQL> select sysdate from dual;
SYSDATE
--------------------
MAY-10-2015
oracle雖然儲存了4位年份,但是如果只提供了2位數字,oracle就會根據所使用的格式是YY還是RR來解釋世紀:
如果日期中的年份是YY格式,並且只提供了兩位年份,那麼久認為這一年的世紀和資料伺服器上的當前世紀相同,這不必多說。
如果日期中採用的是RR格式,並且只提供了後兩位,那麼年份中的前兩位由兩部分決定:
提供年份的兩位數字(指定年),資料庫伺服器上當前日期中年份的後兩位數字,規則如下:(設伺服器當前日期前兩位為F2,指定日期前兩位為Z2)
Z2 in (00 ~ 49) F2 IN(00~49) 同世紀 F2
Z2 IN(50 ~99) F2 IN(00 ~ 49) F2-1
Z2 IN(0~49) F2 IN(50~99) F2+1
Z2 IN(50~99) F2 IN(50~99) F2
SQL> select to_char(to_date('05-MAY-15','DD-MM-RR'),'DD-MM-YYYY') FROM DUAL;
TO_CHAR(TO
----------
05-05-2015
SQL> select to_char(to_date('05-MAY-65','DD-MM-RR'),'DD-MM-YYYY') FROM DUAL;
TO_CHAR(TO
----------
05-05-1965
就先總結到這裡吧!
SQL> select to_date('5-MAY-2015 9:50:45','DD-MON-YY HH24:MI:SS') FROM DUAL;
TO_DATE('5-MAY-201
------------------
05-MAY-15
SQL> select to_date('5-MAY-2015 9:50:45','DD-MON-YYYY HH24:MI:SS') FROM DUAL;
TO_DATE('5-MAY-201
------------------
05-MAY-15
SQL> select to_char(to_date('5-MAY-2015 9:50:45','DD-MON-YYYY HH24:MI:SS'),'MON-DD-YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(TO_DATE('5-M
--------------------
MAY-05-2015 09:50:45
SQL> select to_char(to_date('5-MAY-2015 9:50:45','DD-MM-YYYY HH24:MI:SS'),'MON-DD-YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(TO_DATE('5-MAY-20159:
-----------------------------
MAY-05-2015 09:50:45
SQL> select to_char(to_date('5-MAY-2015 9:50:45','DD-MM-YYYY HH24:MI:SS'),'MM-DD-YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(TO_DATE('5-
-------------------
05-05-2015 09:50:45
可以結合to_char和to_date,可以使用不同格式的時間值。
我們透過設定nls_date_format,指定日期格式,如果是全域性設定,在引數檔案中設定,也可以在session中設定啦:
SQL> show parameter nls_date
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_date_format string
nls_date_language string
SQL> show user;
USER is "HR"
SQL> alter session set nls_date_format='MON-DD-YYYY';
Session altered.
SQL> select sysdate from dual;
SYSDATE
--------------------
MAY-10-2015
oracle雖然儲存了4位年份,但是如果只提供了2位數字,oracle就會根據所使用的格式是YY還是RR來解釋世紀:
如果日期中的年份是YY格式,並且只提供了兩位年份,那麼久認為這一年的世紀和資料伺服器上的當前世紀相同,這不必多說。
如果日期中採用的是RR格式,並且只提供了後兩位,那麼年份中的前兩位由兩部分決定:
提供年份的兩位數字(指定年),資料庫伺服器上當前日期中年份的後兩位數字,規則如下:(設伺服器當前日期前兩位為F2,指定日期前兩位為Z2)
Z2 in (00 ~ 49) F2 IN(00~49) 同世紀 F2
Z2 IN(50 ~99) F2 IN(00 ~ 49) F2-1
Z2 IN(0~49) F2 IN(50~99) F2+1
Z2 IN(50~99) F2 IN(50~99) F2
SQL> select to_char(to_date('05-MAY-15','DD-MM-RR'),'DD-MM-YYYY') FROM DUAL;
TO_CHAR(TO
----------
05-05-2015
SQL> select to_char(to_date('05-MAY-65','DD-MM-RR'),'DD-MM-YYYY') FROM DUAL;
TO_CHAR(TO
----------
05-05-1965
就先總結到這裡吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1632351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 字串和日期時間的處理字串
- Java 日期和時間 API:實用技巧與示例 - 輕鬆處理日期和時間JavaAPI
- Python的時間、日期和時間戳的處理辦法Python時間戳
- 日期時間處理包 Carbon
- LocalDate,LocalDateTime和處理時間、日期工具類LDA
- Laravel日期時間處理包 CarbonLaravel
- Pandas中時間和日期處理
- Calendar類在Java中的應用與日期時間處理Java
- lubridate—輕鬆處理日期時間
- [工具]PHP 中的日期時間處理利器 – CarbonPHP
- [工具]PHP 中的日期時間處理利器 - CarbonPHP
- 【Util】java處理日期時間相加減大全Java
- LocalDateTime替代Date操作處理日期時間LDA
- java日期時間各種變換及處理Java
- Python模組學習:time 日期時間處理Python
- Redis序列化儲存及日期格式的問題處理EKDIRedis
- 日期和時間
- golang版carbon日期時間處理庫,PHP開發者的福利GolangPHP
- Java日期和時間Java
- 伺服器儲存空間不足怎麼處理?伺服器
- 編譯儲存過程時被卡死的處理方法編譯儲存過程
- js獲取指定時間日期和當前時間日期的相差多少時間JS
- Python 日期與時間Python
- 實時流處理與分散式儲存過程中對檔案的操作分散式儲存過程
- 網路傳輸時間和客戶端處理時間的界定(批處理應用)客戶端
- Python 日期和時間Python
- JavaScriptFAQ(二十)——日期和時間JavaScript
- Windows批處理中獲取系統日期、時間戳記Windows時間戳
- Java 8 日期和時間的APIJavaAPI
- MySQL 的日期和時間函式MySql函式
- ASP.NET MVC下使用AngularJs語言(九):日期時間處理與顯示ASP.NETMVCAngularJS
- 使用mysql日期與時間函式輕易搞定日期與時間邏輯MySql函式
- JavaScript字串和時間處理隨筆JavaScript字串
- 整理 js 日期物件的詳細功能,使用 js 日期物件獲取具體日期、昨天、今天、明天、每月天數、時間戳等,以及常用的日期時間處理方法JS物件時間戳
- SQL server 日期與時間操作SQLServer
- PHP 時間處理PHP
- java時間處理Java
- ORACLE 處理時間Oracle