복붙노트

[SQL] 간격 TO_CHAR 포맷

SQL

간격 TO_CHAR 포맷

다음 SQL 명령

select TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))) from table1

000000000 : 00 : 형식의 결과를 생성 03 : 01.954000.

가능 얻기 위해 TO_CHAR 함수의 특별한 형식을 입력하는 것입니다 형식의 결과 : 00 00 : 00 : 00.000?

해결법

  1. ==============================

    1.나는 그것이 전혀 똑똑하지 않으며 당신이 찾고있는 특별한 형식 문자열이지만,이 대답은 출력의 길이가 고정되어 주어진 작업을 수행 실현 :

    나는 그것이 전혀 똑똑하지 않으며 당신이 찾고있는 특별한 형식 문자열이지만,이 대답은 출력의 길이가 고정되어 주어진 작업을 수행 실현 :

    SELECT    SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 1, 1)
           || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 9, 2)
           || ' '
           || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 12, 12)
      FROM table1;
    

    그것은 또한 단지 truncs 소수 초 대신 반올림하지만 나는 그들이 어쨌든 모든 단지 0을있어 귀하의 예제에서 가정합니다.

    이것은 더욱 당황,하지만 난 저항 할 수 없었다 :

    SELECT SUBSTR(REPLACE(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00')))
                         , '0000000', '')
                 , 1, 16)
      FROM table1;
    
  2. ==============================

    2.적은 정밀도를 원하는 경우 결과를 캐스팅 수 :

    적은 정밀도를 원하는 경우 결과를 캐스팅 수 :

    SQL> SELECT TO_DSINTERVAL('10 10:00:00') t_interval FROM dual;
    
    T_INTERVAL
    -----------------------------------------------------------
    +000000010 10:00:00.000000000
    
    SQL> SELECT CAST(TO_DSINTERVAL('10 10:00:00')
      2                 AS INTERVAL DAY(2) TO SECOND(3)) t_interval
      3    FROM dual;
    
    T_INTERVAL
    -----------------------------------------------------------
    +10 10:00:00.000
    

    OP 코멘트 다음 편집 : 오라클 문서 (11gr1)에서 :

    당신이 수동으로 원하는 출력을 달성하기 위해 추출물을 사용해야 할 것 같다 :

    SQL> SELECT to_char(extract(DAY FROM t_interval), 'fmS99999') || ' ' ||
      2         to_char(extract(HOUR FROM t_interval), 'fm00') || ':' ||
      3         to_char(extract(MINUTE FROM t_interval), 'fm00') || ':' ||
      4         to_char(extract(SECOND FROM t_interval), 'fm00.000')
      5    FROM (SELECT TO_DSINTERVAL('10 01:02:55.895') t_interval FROM dual)
      6  ;
    
    TO_CHAR(EXTRACT(DAYFROMT_INTER
    ------------------------------
    +10 01:02:55.895
    

    이것은 매우 우아한 아니지만 마이크로 정밀도를 처리 할 수있는 유일한 방법입니다 보인다.

  3. ==============================

    3.TO_CHAR ()는 REGEXP_SUBSTR는 예컨대 옵션이 될 수 있도록 :( 고정 된 형식을 갖고있는 것 같아요 :

    TO_CHAR ()는 REGEXP_SUBSTR는 예컨대 옵션이 될 수 있도록 :( 고정 된 형식을 갖고있는 것 같아요 :

    SELECT regexp_substr (TO_DSINTERVAL ('10 10:00:00'), '\d{2} \d{2}:\d{2}:\d{2}\.\d{3}') t_interval FROM dual
    
  4. ==============================

    4.간격을 포맷하는 방법을 검색하는 동안 나는 그것이 가치가이 댓글을 추가하는 줄 알았는데, 그래서 스레드 강령술의 약간의 경우는, 그러나 나는이 질문을 가로 질러왔다.

    간격을 포맷하는 방법을 검색하는 동안 나는 그것이 가치가이 댓글을 추가하는 줄 알았는데, 그래서 스레드 강령술의 약간의 경우는, 그러나 나는이 질문을 가로 질러왔다.

    당신이 다음 날짜에 대한 표준 TO_CHAR 형식 요소를 사용할 수 있습니다 제로 시간 요소와 일정한 타임 스탬프를 추가하여 그래서, 타임 스탬프에 간격 결과에 타임 스탬프를 추가 오라클 문서에서 ...

    SELECT TO_CHAR( TIMESTAMP'1969-12-31 00:00:00' + TO_DSINTERVAL('0 00:03:01.954321'),
      'HH24:MI:SS.FF3' ) FROM dual;
    

    그러나 간격으로 하루 이상이되는 경우에 문제가있다. 수득 것 일 대한 포맷 요소는 없다 0 "DDD"이 간격은 다음 날 컸다 그래서 만약 위의 예에서, 1 이상의 365 것, 해의 일이다. 이것은 한 당신의 간격이 24 시간 미만 그러나이 같은 괜찮습니다.

    이를 추가해야하는 것은 물론 영업 이익에 적용 할 수 없을 수 있습니다 그래서는 11g에 있습니다.

  5. ==============================

    5.

    SELECT W.SHIFT_NUMB || ' c: ' ||
           TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMEFROM, 'HH24:MI') ||
           ' по: ' ||
           TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMETO, 'HH24:MI'),
           w.ID
      FROM AC_WORK_SHIFT W
     WHERE W.CLIENT_ID = GC
    

    ( ': MI HH24') 그냥 날짜와 사용 TO_CHAR를 추가!

  6. ==============================

    6.당신은 정규 표현식과 마지막 부분 (또는 일부)를 빼내야 수 있습니다 오라클 REGEXP_REPLACE 그냥 않습니다.

    당신은 정규 표현식과 마지막 부분 (또는 일부)를 빼내야 수 있습니다 오라클 REGEXP_REPLACE 그냥 않습니다.

    표 1에서 - ( '.. *'ARG2, TO_DSINTERVAL (0 0시 0분 0초 '))) TO_CHAR (NVL (ARG1)를 선택 REGEXP_REPLACE

  7. from https://stackoverflow.com/questions/970249/format-interval-with-to-char by cc-by-sa and MIT license