oracle date日期類型 精析


一、date

1.date、sysdate格式說明

  展示

  date類型,展示格式既可以為:YYYY/MM/DD,也可以為YYYY/MM/DD HH24:MI:SS;

  其存儲格式只有一種:YYYY/MM/DD HH24:MI:SS

  展示格式一:

  當你只存年月日時,date實際存儲的是:年月日0時0分0秒,在plsql中,其展示格式為:YYYY/MM/DD,

  將其轉換成YYYY/MM/DD HH24:MI:SS時,返回的是YYYY/MM/DD 00:00:00。

  展示格式二:

  當date實際存儲的是年月日時分秒時,在plsql中,其展示格式為:YYYY/MM/DD HH24:MI:SS;

  系統時間sysdate,在plsql中,其展示格式為:YYYY/MM/DD HH24:MI:SS。

  說明:與插入時的格式無關

  證實

  TESTDATE表結構

  插入sql的日期格式及結果展示

  補充:

  當插入年月日時分秒且時分秒為:00:00:00,在plsql中是不顯示時分秒的。

  要想顯示出來,需用to_char()

  若是還是對推薦有疑問,請看下面的 4.2 查詢指定時間段的數據

2.日期轉字符串

  TO_CHAR(date,format)

  方式一:只帶一個參數

select to_char(t.schedule_date) from CONSULT_SCHEDULE t
--28-APR-17  

  方式二:帶2個參數

  轉換格式不區分大小寫;

  小時格式化:不帶24時,默認為12小時制,24小時格式轉換時需要指明;

  分鍾格式化:可以使用mi或mm,建議使用MI。

  說明:

  格式化成yyyy年mm月dd日

--年月日
--需要填充3個空格,不然‘日’顯示不出來
SELECT TO_CHAR(SYSDATE,'yyyy"年"MM"月"dd"日"   ') 系統日期 FROM DUAL

  

  注意:

  年月日需加上雙引號;

  別名不能加單引號、雙引號。

 

3.字符串轉日期

  方法一:

  TO_DATE('dateStr', format),規則如下:

  轉換格式不區分大小寫;

  小時格式化:不帶24時,默認為12小時制,24小時格式轉換時需要指明;

  分鍾格式化:必須使用mi,不能使用mm,否則會報錯;

  dateStr的長度<=format的長度,都可以實現類型轉換:

  方式一:標准格式

  年月日

  說明:

  年月日時分秒

  方式二:字符串只到分,會自動添加上:00秒。

  

  方式三:字符串也是只到日

 

  方法二:

  DATE'YYYY-MM-DD',並且只能是這一種格式。

 

  另外,TO_DATE(date),該函數也可以只傳一個參數,但是這個參數必須是date類型,

表示的含義是:將任何格式的日期類均轉換成YYYY/MM/DD的格式。

 

4.根據日期查詢數據

  說明:這里着重介紹的是日期字段帶有時分秒的

  4.1 查詢某一天的數據

  測試環境:

  VIRTUAL_CARD表中共有5條記錄;

  字段REGTIME的字段類型為date。

  

  情景模擬:查詢2018年7月18日的數據記錄

  格式要求:日期轉變成YYYY-MM-DD HH24:MI:SS格式的字符串

  方式一:查詢條件使用字符串實現

--查詢條件按字符串進行
SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME
  FROM VIRTUAL_CARD T
 WHERE TO_CHAR(T.REGTIME, 'yyyy-mm-dd') = '2018-07-18'

  方式二:查詢條件使用日期實現

  方法一:TRUNC()

--查詢條件按日期進行1
SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME
  FROM VIRTUAL_CARD T
 WHERE TRUNC(T.REGTIME) = TO_DATE('2018-07-18', 'YYYY-MM-DD')

  方法二:TO_DATE()

--查詢條件按日期進行2
SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME
  FROM VIRTUAL_CARD T
 WHERE TO_DATE(T.REGTIME) = TO_DATE('2018-07-18', 'YYYY-MM-DD')

  方式三:利用TO_DATE()特性

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME
  FROM VIRTUAL_CARD T
 WHERE T.REGTIME >= TO_DATE('2018-07-18', 'YYYY-MM-DD')
   AND T.REGTIME < TO_DATE('2018-07-19', 'YYYY-MM-DD')  

  方法四:TO_CHAR()-->TO_DATE() 不建議使用

SELECT TO_CHAR(T.REGTIME, 'YYYY-MM-DD HH24:MI:SS') REGTIME
  FROM VIRTUAL_CARD T
 WHERE TO_DATE(TO_CHAR(T.REGTIME, 'YYYY-MM-DD'), 'YYYY-MM-DD') =
       TO_DATE('2018-07-18', 'YYYY-MM-DD')

  查詢結果展示

  updateTime--2018年8月15日10點21分

  4.2 查詢指定時間段的數據

  表數據展示

  場景:查詢從2018-08-05至2018-08-06的數據

  錯誤實現方式:

--錯誤實現:between and
SELECT REGTIME
  FROM VIRTUAL_CARD
 WHERE REGTIME BETWEEN TO_DATE('2018-08-05', 'yyyy-mm-dd') AND
       TO_DATE('2018-08-07', 'yyyy-mm-dd')
 ORDER BY REGTIME

  查詢結果:[2018/08/05 00:00:00,2018/08/07 00:00:00]

  方式一:

--方式一:[2018/08/05 00:00:00,2018/08/06 23:59:59]
SELECT REGTIME
  FROM VIRTUAL_CARD
 WHERE REGTIME >= TO_DATE('2018-08-05', 'yyyy-mm-dd') AND
       REGTIME < TO_DATE('2018-08-07', 'yyyy-mm-dd')
 ORDER BY REGTIME

  方式二:推薦使用

--方式二:[2018/08/05 00:00:00,2018/08/07 00:00:00)
SELECT REGTIME
  FROM VIRTUAL_CARD
 WHERE REGTIME >= TO_DATE('2018-08-05', 'yyyy-mm-dd') AND
       REGTIME < TO_DATE('2018-08-06', 'yyyy-mm-dd') + 1 --2018-08-07
 ORDER BY REGTIME  

  方式三:

--方式三
SELECT REGTIME
  FROM VIRTUAL_CARD
 WHERE REGTIME >= TO_DATE('2018-08-05 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND
       REGTIME <= TO_DATE('2018-08-06 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
 ORDER BY REGTIME  

  

 

5.date類型進行加減運算

 

二、timestamp

1.格式

--查詢系統時間戳
SELECT SYSTIMESTAMP FROM DUAL  

 

三、相互轉換

  1.日期轉時間戳

--系統時間轉時間戳
SELECT CAST(SYSDATE AS TIMESTAMP) DATE_TO_TIMESTAMP FROM DUAL

  

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM