当前位置: 首页 > 面试题库 >

sysdate与to_date函数有关的问题

宁弘亮
2023-03-14
问题内容

我看到了这个问题, 所以我对此问题有一个疑问:在以下查询中,在相同日期我得到的结果是不同的。

SELECT TO_CHAR(to_date(sysdate, 'DD-MON-yy'), 'DAY'),
  TO_CHAR(to_date(sysdate, 'DD-MON-yyyy'), 'DAY'),
  TO_CHAR(to_date(sysdate, 'DD-MON-rr'), 'DAY'),
  TO_CHAR(to_date(sysdate, 'DD-MON-rrrr'), 'DAY')
FROM dual;

按列输出:

TUESDAY SUNDAY TUESDAY TUESDAY

请帮助我,在此先谢谢。

编辑

我写了一个简单的过程,通过它可以找到下面给出的日期:

SET serveroutput ON;
CREATE OR REPLACE
    PROCEDURE simple_test
      (
        date_in         IN VARCHAR2)
                        IS
      v_date DATE       := to_date(date_in,'dd-mon-yyyy');
      v_day VARCHAR2(10):=TO_CHAR(v_date,'day');
    BEGIN
       dbms_output.put_line('the day of given date is '||v_day);
    END;
    /

EXEC simple_test(sysdate);

anonymous block completed
the day of given date is sunday

EXEC simple_test(‘01 -JAN-2013’);

anonymous block completed
the day of given date is tuesday

为什么会这样?


问题答案:

我想解释一下为什么您会得到不同的结果。

看到这个sqlfiddle

就像已经说过的那样,sysdate被视为DATE类型,并且您在进行隐式转换时

select to_date(sysdate, format) from dual;

因为to_date的第一个参数应该是varchar类型,所以系统会执行以下操作:

select to_date(to_char(sysdate), format) from dual;

因为您的隐式日期格式为'DD-MON-YY',所以查询进入:

SELECT TO_CHAR(to_date('01-JAN-13', 'DD-MON-yy'), 'DAY'),
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-yyyy'), 'DAY'),
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-rr'), 'DAY'),
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-rrrr'), 'DAY')
FROM dual;

由于yyyy是整整千年的格式,因此第二个to_date转到‘01 -JAN-0013’,它是13AD,可能是SUNDAY :)



 类似资料:
  • 问题内容: 当我运行此查询时,输出为:SUNDAY。但我们知道今天是星期二(2013年1月1日)。和 然后将查询更改为 答案是:星期二。 然后将查询更改为 答案是:星期一。 当我使用sysdate时,为什么将SUNDAY显示为输出? 我是oracle db的新手。请帮我。 问题答案: 用这个: 您正在使用此: 给您日期= 1/1/0013,即星期天

  • SQL用例是否可以显示操作,返回到函数的结果,作为其else条件的结果? //(to_date(r.RENT_RETURN_DATE,'dd-mon-yyyy')-to_date(r.RENT_DUE_DATE,'dd-mon-yyyy')) ----返回一个整数// 当我执行上述查询时,会显示以下错误: 错误报告- SQL错误:ORA-00932:不一致的数据类型:预期CHAR得到编号00932

  • bind_.bind(function, object, *arguments) 绑定函数 function 到对象 object 上, 也就是无论何时调用函数, 函数里的 this 都指向这个 object.任意可选参数 arguments 可以传递给函数 function , 可以填充函数所需要的参数,这也被称为 partial application。对于没有结合上下文的partial ap

  • 但是,当我使用命令行中的ndk-build命令编译它时,会出现以下错误: Android NDK:APP_PLATFORM未设置。默认为最小支持版本Android-16。[arm64-v8a]编译:com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor<=com_celik_Abdullah_ImageProce

  • 我遇到了一个家庭作业的麻烦,创建一个调用另一个类的方法的类。给我们下一课: 然后给出以下提示: 实现一个类Portfolio。这个类有两个对象,checking和savings,类型为BankAccount。实现四种方法: 公用无效存款(双倍金额,字符串帐户) 公开无效提取(双倍金额,字符串帐户) 公有作废转账(双倍金额,字符串账户) 公共双getBalance(字符串帐户) 这里的帐户字符串是“

  • 用户连接RADIUS客户端; RADIUS客户端又连接到RADIUS服务器。如果客户端似乎无法与服务器连接,请首先检查以下内容: FreeRADIUS知道这个客户吗?检查FreeRADIUS日志文件中的以下行: Wed May 18 17:53:57 2012 : Error: Ignoring request to authentication address * port 1812 from