Oracle Pl sql日期初始化比较++;

Oracle Pl sql日期初始化比较++;,oracle,plsql,oracle11g,timestamp,Oracle,Plsql,Oracle11g,Timestamp,我有一个要求,我必须获得特定日期的数据。所以我理想的开始日期应该是2013-06-07 00:00:01 AM,结束日期应该是2013-06-07 23:59:59 AM 因此我编写了这段代码 create or replace PROCEDURE checkChanges IS vc_startDate timestamp; vc_endDate timestamp; begin vc_startDate :=to_timestamp(TO_CHAR(trunc(systime

我有一个要求,我必须获得特定日期的数据。所以我理想的开始日期应该是2013-06-07 00:00:01 AM,结束日期应该是2013-06-07 23:59:59 AM

因此我编写了这段代码

create or replace
PROCEDURE checkChanges

IS

vc_startDate timestamp;
vc_endDate timestamp;
begin 

    vc_startDate :=to_timestamp(TO_CHAR(trunc(systimestamp)-40+((24*60*60)-1)/(24*60*60),'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'); 
    vc_endDate :=to_timestamp(TO_CHAR(trunc(systimestamp)+1/(24*60*60),'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss');

    Dbms_Output.Put_Line('vc_startDate ' ||vc_startDate);
    Dbms_Output.Put_Line('vc_endDate ' ||vc_endDate);

    SELECT EMAIL_ADRESS FROM SOMETABLE A,B
    AND A.CREATE_TS BETWEEN vc_startDate AND vc_endDate ORDER BY B.START_DT;

end checkChanges;
但是我得到的开始日期和结束日期是完全不同的

开始日期:2013年6月7日12.00.01.000000上午


结束日期:2013年6月7日11.59.59.000000 PM

DECLARE
   v_start   TIMESTAMP;
   v_end     TIMESTAMP;
BEGIN
   v_start := TRUNC (SYSTIMESTAMP) + NUMTODSINTERVAL (1, 'second'); --truncate the timestamp and add one second
   DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_start, 'yyyy-mm-dd hh24:mi:ss'));

/*alternate way
v_start := TRUNC (SYSTIMESTAMP) + INTERVAL '0 0:0:1' DAY TO SECOND; --truncate the timestamp and add one second
DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_start, 'yyyy-mm-dd hh24:mi:ss AM'));*/

   v_end :=
        TRUNC (SYSTIMESTAMP)                         --trunacate the timestamp
      + INTERVAL '1 0:0:0.0' DAY TO SECOND                         --add a day
      - NUMTODSINTERVAL (1, 'second');                    --substract a second
   DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_end, 'yyyy-mm-dd hh24:mi:ss'));

/*alternate way
v_end := TRUNC (SYSTIMESTAMP)                     --trunacate the timestamp
                             + INTERVAL '0 23:59:59' DAY TO SECOND; --add hours, mins, s
DBMS_OUTPUT.PUT_LINE (TO_CHAR (v_end, 'yyyy-mm-dd hh24:mi:ss AM'));*/
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
输出:

2013-06-07 00:00:01 AM
2013-06-07 23:59:59 PM
07-JUN-13 12.00.01.000000 AM
07-JUN-13 11.59.59.000000 PM
更新

我还打印了这些值,但没有将其转换为到_char,它的显示与您得到的类似

DBMS_OUTPUT.PUT_LINE (v_start);
DBMS_OUTPUT.PUT_LINE (v_end);
输出:

2013-06-07 00:00:01 AM
2013-06-07 23:59:59 PM
07-JUN-13 12.00.01.000000 AM
07-JUN-13 11.59.59.000000 PM
所以,看起来你所做的是正确的(但有点复杂)。显示时间戳时,它将根据NLS参数显示。使用

SELECT *
  FROM nls_session_parameters
 WHERE parameter = 'NLS_TIMESTAMP_FORMAT';
我猜它会返回这个
DD-MON-RR HH.MI.SSXFF AM

不要担心它是如何显示的。日期/时间戳变量没有格式。只有当你想打印它时,它才重要。如果不使用to_char函数,它将采用NLS参数中定义的格式掩码。如果要重写它,请使用to_char函数并指定掩码。但在查询中使用时,它将具有正确的值