回答

收藏

sysdate与to_date函数有关的问题

技术问答 技术问答 157 人阅读 | 0 人回复 | 2023-09-13

我看到了这个问题, 所以我对此问题有一个疑问:在以下查询中,在相同日期我得到的结果是不同的。, |/ ]9 q% B9 V' _9 `9 d% x
SELECT TO_CHAR(to_date(sysdate, 'DD-MON-yy'), 'DAY'),% r0 a/ R7 K+ j$ O4 @+ T
  TO_CHAR(to_date(sysdate, 'DD-MON-yyyy'), 'DAY'),/ {* x4 n6 y4 a, {0 W6 @
  TO_CHAR(to_date(sysdate, 'DD-MON-rr'), 'DAY'),
; ?; R7 n1 Q: U0 X# r0 s/ z  TO_CHAR(to_date(sysdate, 'DD-MON-rrrr'), 'DAY')
3 j5 E2 b- [4 g3 Z" o# sFROM dual;3 ~4 e6 E0 Y9 h! n# V9 X* _& H
按列输出:8 q; e6 B; }3 A" W! S8 T0 J& ]) G
TUESDAY SUNDAY TUESDAY TUESDAY  D1 `( A% ]7 T
请帮助我,在此先谢谢。) b) e1 |8 {6 _6 a
编辑
: v9 d! T/ A* V" D# z我写了一个简单的过程,通过它可以找到下面给出的日期:
$ q2 @) k1 a& NSET serveroutput ON;4 i2 g3 D( `) D2 I0 a6 {
CREATE OR REPLACE
, R+ U7 L1 j1 k3 h4 \    PROCEDURE simple_test- e5 n( m/ }: ~2 o
      (2 u& F3 m1 N5 F, l$ @9 w
        date_in         IN VARCHAR2)- H) e9 F5 f" O/ @
                        IS9 r  `* n+ H# k$ @
      v_date DATE       := to_date(date_in,'dd-mon-yyyy');
% R2 `. e- I0 M6 w3 |      v_day VARCHAR2(10):=TO_CHAR(v_date,'day');9 H' h+ K, @1 T
    BEGIN
  l( f. ^4 v) [7 @" U8 \       dbms_output.put_line('the day of given date is '||v_day);
( g: T& z$ O) R2 }/ i. y5 o9 D: M    END;
+ o$ G3 v5 ?. M" o/ q1 p1 c    /
! G9 t' p* y1 z1 O" M, fEXEC simple_test(sysdate);0 F& ^/ ?5 V4 ?
anonymous block completed2 d* Q" L% `# g6 [
the day of given date is sunday3 L. h. h( G  W# j
EXEC simple_test(‘01 -JAN-2013’);
$ m+ u# t7 v/ ^$ V+ l& f5 |: ?anonymous block completed3 z) t! N9 i7 l" d
the day of given date is tuesday- [; Y, u; ^+ s+ c" q* ]" H+ m- n
为什么会这样?
- K( H$ j( k5 Y& I. W6 {# _                * |3 r/ a. A/ v
解决方案:+ t! B0 O$ C) J/ r$ D, s
               
4 U' v0 h& w6 X; ?+ }
$ x$ T- {1 N& J+ m! Y, h; Z  Z
  m/ a: z" q+ }5 Z8 q                我想解释一下为什么您会得到不同的结果。. C, r3 K6 e  D0 k
看到这个sqlfiddle! L" O) S1 F# U1 m/ ?& ^
就像已经说过的那样,sysdate被视为DATE类型,并且您在进行隐式转换时
9 A) u7 x  h9 D2 u6 P% Gselect to_date(sysdate, format) from dual;
! D5 _# b1 v1 G因为to_date的第一个参数应该是varchar类型,所以系统会执行以下操作:
! N+ w' u; {. _! Q4 W! l( H' J' Wselect to_date(to_char(sysdate), format) from dual;
% @. m0 t5 a7 N因为您的隐式日期格式为'DD-MON-YY',所以查询进入:
; g, s- V7 e* A& G" v) B4 G( K$ o# ISELECT TO_CHAR(to_date('01-JAN-13', 'DD-MON-yy'), 'DAY'),
- e+ J7 L7 s; y, X4 T  TO_CHAR(to_date('01-JAN-13', 'DD-MON-yyyy'), 'DAY'),+ r6 _# ?# s5 V
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-rr'), 'DAY'),; S) k  D2 _  ]5 z* X3 T
  TO_CHAR(to_date('01-JAN-13', 'DD-MON-rrrr'), 'DAY')
' U: Q* V- K6 Q6 r# Q9 EFROM dual;" \6 F- m' {1 ~: ?: P) i9 v
由于yyyy是整整千年的格式,因此第二个to_date转到‘01 -JAN-0013’,它是13AD,可能是SUNDAY
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则