Oracle日期比较问题完全混淆 - 我做错了什么?

时间:2013-12-27 14:32:41

标签: oracle plsql

我是新手&学习Oracle。我想比较函数中的日期,同时实现函数我得到一个输出错误但没有得到有效答案的问题我搜索了很多解决方案但是徒劳无功....

到目前为止我找到的解决方案是:

  1. 不要将日期时间与日期进行比较。

  2. 如果使用DateTime,则需要首先使用TRUNC来删除时间因素。

  3. 将日期优先转换日期与To_char(anyDate,'dd-mon-yyyy')进行比较;

  4. 如果我们比较1-dec-13到27-dec-13之类的日期,请确保一年中两者都相同。两者都应该是2013年。

  5. 到目前为止,我已经通过了所有限制但找不到解决方案。有谁能够帮我。我在做什么大错?提前感谢您的期待。

     SET serveroutput on;
     DECLARE
     startDate DATE := to_date('1'|| '/' ||to_char(sysdate, 'MM')  || '/2013','DD/MM/YYYY'); 
     secDate DATE :=to_date(SYSDATE, 'DD/MM/YYYY ');
    
     BEGIN
    
       DBMS_OUTPUT.PUT_LINE( 'if secDate  '|| secDate ||' is Greater Then'); 
       DBMS_OUTPUT.PUT_LINE( 'StartDate '|| startDate || ' Output = ' );   
    
       if(secDate>startDate)
        then
        DBMS_OUTPUT.PUT_LINE('True' ); 
        else    
        DBMS_OUTPUT.PUT_LINE('false'); 
    
       end if;
    end;
    

3 个答案:

答案 0 :(得分:4)

您的要点:

Oracle DATE保留日期和时间,精确到秒。您可以对它们进行比较,例如12/27/2013 00:00:00小于12/27/2013 09:00:00

ii 如果您想查看带有时间组件的两个DATE值(例如12/27/2013 14:00:0012/27/2013 12:34:56)是否在同一天,那么是的,您需要TRUNCIF TRUNC(firstDate) = TRUNC(secondDate)

iii 使用TO_CHAR比较DATE值无法获得任何好处。如果您不想在比较中包含时间,请使用TRUNC;如果你想要时间,请把它留下来。

iv 这些年份不一定相同。 12/27/2013之类的日期大于12/27/2012且小于12/27/2014。如果将其保留为DATE类型,Oracle将做正确的事。

至于您的代码出了什么问题,请查看您的startDate初始化:

'1'|| '-' ||to_char(sysdate, 'MM')  || '2013'

今天,这会给你1-122013,它与DD/MM/YYYY来电中的格式字符串TO_DATE不符。这就是为什么你没有得到一个体面的约会。

如果您想获得当月的第一天,Oracle提供了一个方便的快捷方式:

startDate := TRUNC(SYSDATE, 'MONTH');

所以我会忘记所有的格式,并选择这样的东西;请注意它是如何简单:

SET serveroutput on;
DECLARE
  startDate DATE := TRUNC(SYSDATE, 'MONTH');
  secDate DATE := SYSDATE;
BEGIN
  DBMS_OUTPUT.PUT_LINE( 'if secDate  '|| secDate ||' is Greater Then'); 
  DBMS_OUTPUT.PUT_LINE( 'StartDate '|| startDate || ' Output = ' );   

  if(secDate>startDate) then
    DBMS_OUTPUT.PUT_LINE('True' ); 
  else    
    DBMS_OUTPUT.PUT_LINE('false'); 
  end if;
END;

请注意,secDate仅在每月第一天的午夜时等于startDate,此时两个值(2013年12月)都为12/27/2013 00:00:00。在本月的其他所有时间,secDate都会更大。

请注意,我使用12/27/2013 00:00:00来解释2013年12月27日午夜。那就是我可以用英语解释日期。这不是Oracle存储日期的方式。 Oracle如何存储日期?这并不重要 - 重要的是,如果您将日期保留为DATE格式,并且只关心日期而不关心时间,请使用TRUNC来处理日期。 / p>

答案 1 :(得分:3)

to_date(SYSDATE, 'DD/MM/YYYY ')这是你的问题。结果是27.12.0013。这就是你打印false的原因。实际上,您不需要将sysdate转换为日期,因为它已经是类型日期。请改用:

secDate DATE := SYSDATE;

答案 2 :(得分:0)

请参阅此行to_date('1'|| '-' ||to_char(sysdate, 'MM') || '2013','DD/MM/YYYY');

'1'|| '-' ||to_char(sysdate, 'MM') || '2013'会给你'1-122013',所以你做了 to_date('1-122013','DD/MM/YYYY');

格式不匹配,您必须更改其中一个

to_date('01/'|| to_char(sysdate, 'MM')|| '/2013','DD/MM/YYYY');

to_date('01'|| '-' ||to_char(sysdate, 'MM')|| '2013','DD-MMYYYY')

而不是secDate DATE :=to_date(SYSDATE, 'DD/MM/YYYY ');只使用secDate DATE :=TRUNC(SYSDATE);,而不需要转换。