2017-03-21 80 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; 
相关问题