2017-03-21 115 views
0

發現難以在我的腳本中格式化日期和時間戳。正確使用日期和時間戳Oracle數據類型

v_date1 Date; 
v_date2 timestamp; 

假設我有一個CREATED_DATE字段和值是'31 -03-2017 18時02分05' 秒

select c1 into v_date1 from table_a; 

給我 - '31 -03-2017'

select c1 into v_date2 from table_a; 

給我 - '31 -03-2017下午6時02分05秒」

我試圖通過遊標獲取數據,從而迭代它進行少量驗證。

如何確保v_date2只考慮日期和時間?

請幫忙。

+0

通常,時間戳存儲與日期類型和七個分數相同的信息。如果你在你的數據庫客戶端設置差異,那麼它只是格式化。 –

回答

0

DATE數據類型將存儲日期和時間戳。但是,時間戳數據類型也會存儲幾分之一秒。

您未看到時間爲DATE數據類型的原因是因爲您的NLS設置。將其更改爲以下

ALTER SESSION SET nls_date_format='DD-MM-YYYY HH24:MI:SS'; 
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MM-RR HH24.MI.SSXFF'; 

使用timestamp只有幾秒鐘分數在你的代碼關係。 DATE可以用於任何其他用途。

0

我想你誤會了日期和時間戳

select c1 into v_date1 from table_a; 

給你一個日期對象

v_date2 timestamp; 

給你一個時間戳對象

這兩個對象包含日期和時間部分。時間戳記也包含更詳細的信息(小部分第二信息)。

如果你想到目前爲止,只有你可以使用一些內置的功能...

有關完整信息...

select systimestamp from dual; 
select sysdate from dual; 

但要知道,你的查詢環境可能不顯示完整的日期信息取決於其設置。

要刪除時間部分...

select trunc(systimestamp) from dual; 
select trunc(sysdate) from dual; 

或多個控制

select trunc(systimestamp, 'dd') from dual; 
select trunc(sysdate, 'dd') from dual; 

其中「DD」可以用比如如果你想「YYYY」其他值替換獲得一年中的第一天或「月」的第一天。

或倒圓而不是刪除(使用可選的值再次與天是默認值)

select round(systimestamp, 'dd') from dual; 
select round(sysdate, 'dd') from dual; 

然而所有這些功能仍然返回數據/時間戳值,使他們仍然包含時間信息 - 它只是操縱。

如果你想要的是你需要使用你喜歡什麼都日期格式TO_CHAR

select to_char(systimestamp, 'dd-mm-yyyy') from dual; 
select to_char(sysdate, 'dd-mm-yyyy') from dual; 

使用一天的字符串。

0

要理解這種差異,您需要先了解會話會話nls設置如何工作。

SQL> @C:\Users\44011713\Desktop\so_test.sql 
SQL> SET SQLBL ON; 
SQL> SET ECHO ON; 
SQL> SET FEEDBACK ON; 
SQL> 
SQL> 
SQL> --To understand this differenence you need to first understand how session nls settings work. 
SQL> 
SQL> SELECT * FROM nls_session_parameters 
    2 where parameter = 'NLS_DATE_FORMAT'; 

PARAMETER                  
-------------------------------------------------------------------------------- 
VALUE                   
-------------------------------------------------------------------------------- 
NLS_DATE_FORMAT                 
MM/DD/YYYY                  


1 row selected. 

SQL> 
SQL> 
SQL> SELECT CURRENT_DATE FROM DUAL; 

CURRENT_DA                  
----------                  
03/22/2017                  

1 row selected. 

SQL> -- Since we are fetcing date value and the session format mask is MM/DD/YYYY so the output --will be aligning to this format only 
SQL> 
SQL> SELECT * FROM nls_session_parameters 
    2 where parameter = 'NLS_TIMESTAMP_FORMAT'; 

PARAMETER                  
-------------------------------------------------------------------------------- 
VALUE                   
-------------------------------------------------------------------------------- 
NLS_TIMESTAMP_FORMAT                
MM/DD/YYYY HH24:MI:SS.FF6              


1 row selected. 

SQL> 
SQL> 
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'MM/DD/YYYY HH24:MI:SS.FF6'; 

Session altered. 

SQL> 
SQL> SELECT LOCALTIMESTAMP FROM DUAL; 

LOCALTIMESTAMP                 
---------------------------------------------------------------------------  
03/22/2017 09:53:54.133795              

1 row selected. 

SQL> -- Since we are fetcing date value and the session format mask is MM/DD/YYYY --HH24:MI:SS.FF6 so the output will be aligning to this format only 
SQL> 
SQL> --Now lets tweak some settings :P 
SQL> 
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY HH24:MI:SS'; 

Session altered. 

SQL> 
SQL> SELECT CURRENT_DATE FROM DUAL; 

CURRENT_DATE                  
-------------------                
03/22/2017 09:53:54                

1 row selected. 

SQL> -- And now the format aligns to the forced the setting done by ALTER SESSION. 
SQL> 
SQL> -- So above example illustrates how the the format ca be changed for session 
SQL> 
SQL> --Hope this helps. 
SQL> spool off; 
相關問題