0

发现很难在我的脚本中格式化日期和时间戳。

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 06:02:05 PM'

我正在尝试通过游标获取数据,从而对其进行迭代以进行少量验证。

如何确保 v_date2 只考虑日期和时间?

请帮忙。

4

3 回答 3

1

要了解这种差异,您需要首先了解会话会话 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;
于 2017-03-22T04:25:19.790 回答
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;

如果您想获得一年的第一天或一个月的第一天的“mm”,则可以将“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;

使用您喜欢的任何日期格式。

于 2017-03-21T10:56:03.303 回答
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 可用于任何其他用途。

于 2017-03-21T10:31:52.127 回答