처리의 편의상

존재여부에 따라 Insert와 Update를 할 수 있는

Merge를 사용하게 되는데...

 

Oracle은 JDBC Driver의 문제도 자주 생기지만 (최신 버전을 사용하면 거의 해결되는...)

그렇지 않은 경우도 존재한다.

 

이런 경우를

잘못 만나면

시간만 엄청 날릴 수 있다...;;;

 

 

Varchar, CLOB Type을 사용하는 컬럼이

1,000 여자일 경우에는 Merge도 무난하다.

 

하지만, 그 이상의 경우에는

 

Check the statement (update failed).  ← merge를 통한 insert의 경우에도 update로 인식;;;

Cause: java.sql.SQLException: 소켓에서 읽을 데이터가 없습니다

 

 

번거롭지만

Insert / Update로 분리하면

상황 종료...;;;

 

 

  1. 크립텍스 2018.01.17 13:42

    천사신가요? 덕분에 살았어요 감사합니다 엉엉흐흑 그런 의미로 퍼가요!

    • 행이™ 2018.01.20 23:36 신고

      보는 눈이 있으시군요~ ^^
      헬에 빠지지 않으셨으면 다행입니다~ ㅎ

  2. JustSmile 2021.07.07 13:40

    감사합니다..
    덕분에 원인을 금방 찾았어요 ㅠㅠ
    지옥에 떨어지지 않아서 다행입니다.

Temp Table A를 만들고

그 Temp Table 에 항목 B를 추가해서

 

Temp Table C를 만들어야 한다면

 

어렵게 생각하지 않아도 된다.

 

이미 Temp Table A를 만들었다면

이미 99%는 해 놓은 거나 마찬가지다.

 

 

WITH TB_MAIN AS (

    SELECT LEVEL AS LV_NO
    FROM   DUAL
    CONNECT BY LEVEL <= 3

 )
 , TB_SUB AS (

    SELECT a.*
            , SYSDATE + LV_NO AS SYSDATE_PLUS_LV_NO
    FROM   TB_MAIN a

 )

 

 SELECT *
 FROM   TB_SUB
 ;

 

 

첫 번째 Temp Table 정의 ( ) 뒤에

, 로 구분해서

두 번째 Temp Table명 AS ( sqls... ) 만

추가하면 끝인 것이었던 것이었던 것이었다.

 

 

[Oracle] 조회 결과 Row를 하나의 Column으로 표시하는 방법

 

종[縱]으로 된 결과를 횡[橫]으로 표시

세로로 된 결과를 가로로 표시

 

 

 

 SELECT 'A' AS COL_NAME
         , LEVEL AS LV_NO
 FROM   DUAL
 CONNECT BY LEVEL <= 3

 ;

 

 

위 SQL을 실행하면, 아래 처럼 조회된다.

 

 COL_NAME     LV_NO
 ========    =====
 A                  1
 A                  2
 A                  3

 

 

위의 결과를 아래처럼 조회하기 위해서는

 

 COL_NAME     LV_NOS
 ========    ======
 A                  1,2,3

 

요론 SQL을 사용하면 된다.

 

 SELECT COL_NAME
         , SUBSTR(XMLAGG(XMLELEMENT(COL ,',', LV_NO) ORDER BY LV_NO).EXTRACT('//text()').GETSTRINGVAL(), 2) AS LV_NOS
 FROM ( SELECT 'A' AS COL_NAME
                    , LEVEL AS LV_NO
            FROM   DUAL
            CONNECT BY LEVEL <= 3
 )
 GROUP BY COL_NAME
 ;

 

ORDER BY는 원하는 순서대로 조절하면 된다.

 

 

기본 명령들만 사용해서

년,월 (예:201512) 을 입력받고

해당 년월의 달력 형태로 조회하는 SQL

 

 SELECT WEEK_NUM
      , MAX(DECODE(DAY_NUM, 1, MONTH_DAY)) AS DAY1
      , MAX(DECODE(DAY_NUM, 2, MONTH_DAY)) AS DAY2
      , MAX(DECODE(DAY_NUM, 3, MONTH_DAY)) AS DAY3
      , MAX(DECODE(DAY_NUM, 4, MONTH_DAY)) AS DAY4
      , MAX(DECODE(DAY_NUM, 5, MONTH_DAY)) AS DAY5
      , MAX(DECODE(DAY_NUM, 6, MONTH_DAY)) AS DAY6
      , MAX(DECODE(DAY_NUM, 7, MONTH_DAY)) AS DAY7
 FROM ( SELECT DECODE( DAY_NUM, 1, WEEK_NUM+1, WEEK_NUM ) AS WEEK_NUM
             , DAY_NUM
             , MONTH_DAY
        FROM ( SELECT DECODE(IS_JAN, 'Y', CASE WHEN TO_CHAR(MONTH_DAY, 'DD') <= '06'
                                                AND TO_CHAR(MONTH_DAY, 'IW') > '50'
                                               THEN '00'
                                               ELSE TO_CHAR(MONTH_DAY, 'IW')
                                          END
                                        , TO_CHAR(MONTH_DAY, 'IW')) AS WEEK_NUM
                    , TO_CHAR(MONTH_DAY, 'D') AS DAY_NUM
                    , RNUM AS MONTH_DAY
               FROM ( SELECT a.START_DT + (b.RNUM-1) AS MONTH_DAY
                           , a.IS_JAN
                           , b.RNUM
                      FROM ( SELECT TO_DATE('201512'||'01', 'YYYYMMDD') AS START_DT
                                  , DECODE(SUBSTR('201512',5,2), '01', 'Y') AS IS_JAN
                             FROM   DUAL
                           ) a
                         , ( SELECT LEVEL AS RNUM
                             FROM   DUAL
                             CONNECT BY LEVEL <= ( SELECT TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('201512'||'01', 'YYYYMMDD')),'DD'))
                                                   FROM   DUAL )
                           ) b
               )
        )
 )
 GROUP BY WEEK_NUM
 ORDER BY WEEK_NUM

 

 

'plming > DB' 카테고리의 다른 글

[Oracle] WITH(Temp Table) 2개 사용하기?  (0) 2016.04.07
[Oracle] 조회 결과 Row를 하나의 Column으로 표시하는 방법  (0) 2016.04.07
Oracle - 월 달력 SQL  (0) 2015.12.03
MySQL - 한글사용  (0) 2015.09.02
Oracle VS MySQL  (0) 2015.09.02
MySQL - ALTER  (0) 2015.09.02

Oracle VS MySQL

 

 ORACLE

 MySQL

 NVL

 IFNULL

 SYSDATE

 NOW()

 TRUNC(SYSDATE)

 CURDATE()

 TO_CHAR()

 

 DATE_FORMAT()

 TO_CHAR(SYSDATE,

 'YYYY-MM-DD HH24:MI:SS')

 DATE_FORMAT(NOW(),

 '%Y-%m-%d %H:%i:%s')

 요일 값 : 1 ~ 7

 요일 값 : 0(일) ~ 6(토)

 TO_DATE()

 STR_TO_DATE()

 SYSDATE - 1 : 1일전

 DATE_ADD(NOW(), INTERVAL -1 DAY)

 DATE_SUB(NOW(), INTERVAL 1 DAY)

 날짜형식 구분자

 MICROSECOND
 SECOND
 MINUTE
 HOUR
 DAY
 WEEK
 MONTH
 QUARTER
 YEAR

 SECOND_MICROSECOND
 MINUTE_MICROSECOND
 MINUTE_SECOND
 HOUR_MICROSECOND
 HOUR_SECOND
 HOUR_MINUTE

 DAY_MICROSECOND

 

 DAY_SECOND
 DAY_MINUTE
 DAY_HOUR
 YEAR_MONTH

 날짜형식 구분자

 MICROSECONDS
 SECONDS
 MINUTES
 HOURS
 DAYS
 WEEKS
 MONTHS
 QUARTERS
 YEARS

 'SECONDS.MICROSECONDS'
 'MINUTES:SECONDS.MICROSECONDS'
 'MINUTES:SECONDS'
 'HOURS:MINUTES:SECONDS.MICROSECONDS'
 'HOURS:MINUTES:SECONDS'
 'HOURS:MINUTES'

 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS'
 'DAYS HOURS:MINUTES:SECONDS'
 'DAYS HOURS:MINUTES'
 'DAYS HOURS'
 'YEARS-MONTHS'

 Outer Join : 조건 컬럼에 (+)

 FROM절에 기술

 LEFT/RIGHT OUTER JOIN 테이블 ON 조건

 WHERE ROWNUM > 3 AND ROWNUM < 7  LIMIT 4, 3

 SELECT ROWNUM

 SELECT @rownum := @rownum+1 AS ROWNUM
 FROM xx
 JOIN (SELECT @rownum := 0) R
 DECODE  CASE WHEN .. THEN .. ELSE .. END

 컬럼 사용시 대소문자 관계없음

 컬럼 사용자 대소문자 일치해야 함

 문자열 붙임(||)  CONCAT
 TO_CHAR, TO_NUMBER

 CAST(xx AS CHAR), CAST(xx AS SIGNED)

 

 

'plming > DB' 카테고리의 다른 글

Oracle - 월 달력 SQL  (0) 2015.12.03
MySQL - 한글사용  (0) 2015.09.02
Oracle VS MySQL  (0) 2015.09.02
MySQL - ALTER  (0) 2015.09.02
MSSQL - 시간계산  (0) 2015.07.22
MSSQL - MSDN, 기본함수  (0) 2015.07.15

출처 : http://www.sqler.com/269782

 

 

1.     문자 식에서 가장 왼쪽 문자의 ASCII 코드 값 반환 (숫자로 표시됨)

구분

MSSQL

Oracle

함수

ASCII

ASCII

용례

SELECT ASCII('A')

SELECT ASCII('A') FROM DUAL

결과

65

65

è  MSSQL이든 ORacle이든 ‘’ 안에 여러 개의 문자가 있어도 가장 좌측 값만 반환합니다.

, SELECT ASCII(‘A’) SELECT ASCII(‘ABCDEFG’) 나 결과는 같습니다.

 

 

2.     문자 합치기

구분

MSSQL

Oracle

함수

+

CONCAT 또는 ||

용례

SELECT '동해물과' + '백두산이'

1. SELECT '동해물과 ' || '백두산이' FROM DUAL

2. SELECT CONCAT('동해물과 ','백두산이') FROM DUAL

결과

동해물과 백두산이

동해물과 백두산이

 

 

3.     ASCII 코드를 문자로 변환하기

구분

MSSQL

Oracle

함수

CHAR

CHR

용례

SELECT CHAR(67)

SELECT CHR(67) FROM DUAL

결과

C

C

è  참고로 9번은 TAB, 10LF(Line Feed), 13번은 CR(Carriage Return) 입니다.

 

 

4.     좌측에서 몇 번째에 해당 문자가 있는지 알려주기

구분

MSSQL

Oracle

함수

CHARINDEX

INSTR

용례

SELECT CHARINDEX('마이', '고마해라. 마이 무우따 아이가?')

SELECT INSTR('고마해라. 마이 무우따 아이가?','마이' ) FROM DUAL

결과

7

7

è  MSSQLOracle의 함수사용 순서가 다릅니다.

è  MSSQL에는 패턴찾기에 PATINDEX를 많이 사용합니다. 위와 같은 결과를 얻으려면

SELECT PATINDEX('%마이%', '고마해라. 마이 무우따 아이가?')

처럼 사용하면 됩니다.(와일드 카드 사용 가능)

 

 

5.     대문자 변환, 소문자 변환

구분

MSSQL

Oracle

함수

UPPER / LOWER

UPPER / LOWER

용례

SELECT UPPER('aBcDeF'), LOWER('aBcDeF')

SELECT UPPER('aBcDeF'), LOWER('aBcDeF') FROM DUAL

결과

ABCDEF abcdef

ABCDEF abcdef

 

 

6.     좌측공간을 특정 문자로 채워주기

구분

MSSQL

Oracle

함수

지원하지 않음(없음)

LPAD

용례

-

SELECT LPAD('13579',10, '0') FROM DUAL

결과

-

0000013579

è  MSSQL에선 없는 함수이기 때문에 아래와 같이 사용자함수를 만들어서 사용하기도 합니다.

-- 1. FUNCTION 만들기

CREATE FUNCTION dbo.UFN_LPAD

(

       @INPUT VARCHAR(8000),

       @COUNT AS INT,

       @FILLCHAR AS CHAR(1)=' '

)

RETURNS varchar(200)

AS

BEGIN

RETURN

       CASE

             WHEN LEN(@INPUT) >= @COUNT THEN LEFT(@INPUT, @COUNT)

       ELSE

             LEFT(REPLICATE(@FILLCHAR, @COUNT), @COUNT-LEN(@INPUT)) + @INPUT

       END

END

 

 

-- 2. SAMPLE

SELECT dbo.UFN_LPAD('12',10,'0') AS PR_KEY

 --> 결과

 0000000012

 

 

 

7.     우측공간을 특정 문자로 채워주기

구분

MSSQL

Oracle

함수

지원하지않음(없음)

RPAD

용례

-

SELECT RPAD('13579',10, '0') FROM DUAL

결과

-

1357900000

è  MSSQL에선 없는 함수이기 때문에 UFN_LPAD처럼 함수를 만들어서 씁니다.

다만, REPLICATE라는 함수가 있는데, 이것은 특정문자를 연속적으로 채워 줄 뿐, RPAD와는 조금 다릅니다.

-- 사용례

SELECT REPLICATE('0',10)

 --> 결과

 0000000000

   또한, SPACE라는 함수는 공백만 채워줍니다.

-- 사용례

SELECT '나의' + SPACE(10) + ''

 --> 결과

 나의        

 

 

8.     /우 공백 없애주기

구분

MSSQL

Oracle

함수

LTRIM / RTRIM

LTRIM / RTRIM

용례

SELECT LTRIM('  아버지'), RTRIM('어머니 ')

SELECT LTRIM('  아버지'), RTRIM('어머니  ') FROM DUAL

결과

아버지   어머니  à (공백제거됨)

아버지   어머니  à (공백제거됨)

 

 

9.     문자의 음성표현을 가지는 문자열을 반환. 국내에서는 흔히 사용하지 않음(한글 동작 안함)

b, f, p, v = 1

c, g, j, k, q, s, x, z = 2

l = 4

m, n = 5

r = 6

구분

MSSQL

Oracle

함수

SOUNDEX

SOUNDEX

용례

SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');

SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') FROM DUAL

결과

S252     S200

S530     S530

è  어라? 예제에는 같은 것으로 되어 있는데, 실제 결과는 다르네요. -_- 이것 참

 

 

10.   전체 문자열에서 지정한 길이만큼의 문자열 반환

구분

MSSQL

Oracle

함수

SUBSTRING

SUBSTR

용례

SELECT SUBSTRING('1234567890',4,5)

SELECT SUBSTR('1234567890',4,5) FROM DUAL

결과

45678

45678

è  4번째 자리에서 시작해서 다섯 글자를 가져옵니다.

 

 

11.   문자열 변환

구분

MSSQL

Oracle

함수

REPLACE

REPLACE

용례

SELECT REPLACE('1234567','123','321')

SELECT REPLACE('1234567','123','321') FROM DUAL

결과

3214567

3214567

è  MSSQL STUFF라는 함수가 있는데요. 이것은 엑셀의 REPLACE와 같습니다.

SELECT STUFF('13579',2,3,'222')

--> 결과

12229

 

 

12.   음절의 첫 글자만 대문자로 변환(Pascal Case)

구분

MSSQL

Oracle

함수

지원하지 않음

INITCAP

용례

-

SELECT INITCAP('we are the world') FROM DUAL;

결과

-

We Are The World

 

 

 

11.   문자열에서 특정 문자만 쏙쏙 골라서 다른 문자로 변환, 정확하게 이야기하면 지정한 문자와 맞으면 특정 문자로 처리함, 또는 특정 지정문자가 없는 경우 해당 문자를 삭제함.   

구분

MSSQL

Oracle

함수

지원하지 않음

TRANSLATE

용례

-

SELECT TRANSLATE('NothingToUse','o','!')  FROM DUAL;

SELECT TRANSLATE('BFG123', '12345BCDEFG', '123XXXXXXXX') FROM DUAL;

결과

-

N!thingT!Use

XXX123

 

è  아래 SAMPLE을 참조하세요.

create table translate_test

(

    mem_id varchar(20)

)

;

 

INSERT INTO translate_test (mem_id) values ('ABCD1234');

INSERT INTO translate_test (mem_id) values ('abcdef');

INSERT INTO translate_test (mem_id) values ('585472');

 

COMMIT;

 

select mem_id, translate(mem_id, '0123456789' || mem_id, '0123456789')

from translate_test;

 

-- 결과

ABCD1234         1234

abcdef  

585472  585472

 

 

 

14.   나열한 인수 중 가장 큰 값 / 작은 값을 반환

구분

MSSQL

Oracle

함수

지원하지 않음

GREATEST / LEAST

용례

-

SELECT GREATEST('Z9', '나의','','A341', '999','123')  FROM DUAL;

SELECT LEAST('Z9', '나의','','A341', '999','123')  FROM DUAL;

결과

-

/ 123

è  비교하는 것은, 문자순위(A보다는 Z가 크다. 한글은 자모순서에 의함), 숫자순위(0보다는 9가 크가), 글자수단위(같은 문자로 시작하더라도 결국 글자수가 많은 것이 크다.)

 

 

15.   길이 가져오기, 또는 BYTE 단위 길이 가져오기

구분

MSSQL

Oracle

함수

LEN, DATALENGTH

LENGTH

용례

SELECT LEN('NothingToUse')

SELECT DATALENGTH('NothingToUse')

SELECT LEN('지원하지 않음')

SELECT DATALENGTH('지원하지 않음')

SELECT LENGTH('NothingToUse') FROM DUAL;

SELECT LENGTH('지원하지 않음') FROM DUAL;

결과

12 / 12 / 7 / 13

12 / 7

è  위에서 보시면 알겠지만, BYTE 단위로 길이를 확인하시려면 LEN 이 아닌 DATALENGTH 를 사용하셔야 합니다.

 

 

16.   NULL 일 경우 대체값 표시.

구분

MSSQL

Oracle

함수

ISNULL

NVL

용례

SELECT ISNULL(QTY1,100) FROM A_TEMP

SELECT NVL(QTY1,100) FROM A_TEMP;

결과

100 (값이 NULL일 경우)

100 (값이 NULL 일 경우)

 

 

17.   숫자형을 문자형으로 변환

구분

MSSQL

Oracle

함수

STR, CONVERT, CAST

TO_CHAR

용례

SELECT 123 + 456

SELECT STR(123) + STR(456)

SELECT STR(123,3,0) + STR(456,3,0)

SELECT TO_CHAR(123) || TO_CHAR(456) FROM DUAL;

SELECT 123 || 456 FROM DUAL;

결과

579

123       456

123456

123456

123456

è  MSSQLSTR는 기본 자릿수가 10자리입니다.

è  Oracle에서는 위에서 보시다시피 숫자형태를 Concat하더라도 자동적으로 문자로 나옵니다.

è  물론 MSSQL에서는 CONVERT CAST를 훨씬 더 많이 사용합니다.

SELECT CONVERT(VARCHAR(3),123) + CONVERT(VARCHAR(3),456)

--> 결과

123456

 

 

18.   문자형을 숫자형으로 변환

구분

MSSQL

Oracle

함수

CONVERT, CAST

TO_NUMBER

용례

SELECT '123' + '456'

SELECT CONVERT(INT,'123') + CONVERT(INT,'456')

SELECT CAST('123' AS INT) + CAST('456' AS INT)

SELECT TO_NUMBER('123') + TO_NUMBER('456') FROM DUAL;

결과

123456 / 579 / 579

579

 

 

19.   조건처리 구문

구분

MSSQL

Oracle

함수

CASE

CASE (DECODE)

è  MSSQL CASE문은 여러 개의 조건 중 맞는 결과를 표시하는 것이고, Oracle DECODE는 참/거짓에 따라 결과를 표시합니다.

1)     MSSQL CASE SAMPLE

-- 1. 테이블생

CREATE TABLE CASE_STUDY

(PKEY INT PRIMARY KEY,

DATA1 VARCHAR(20),

DATA2 VARCHAR(30)

);

 

-- 2. 자료 입력

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (1, 'A', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (2, 'B', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (3, 'C', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (4, 'D', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (5, 'E', '');

 

-- 3. 데이터 출력

SELECT

       PKEY,

       CASE

             WHEN PKEY = 1 THEN DATA1

             WHEN PKEY = 2 THEN DATA2

             WHEN PKEY = 3 THEN DATA1

             ELSE DATA2

       END AS DATA

FROM

       CASE_STUDY

;

 

-- 4. 결과

1      A      -- 1 DATA1

2           -- 2 DATA2

3      C      -- 3 DATA1

4           -- 아니면 DATA2

5           -- 아니면 DATA2

 

2)     같은 자료를 Oracle DECODE를 사용할 경우

 

-- 1. 테이블생

CREATE TABLE CASE_STUDY

(

  PKEY NUMBER(9),

  DATA1 VARCHAR2(20),

  DATA2 VARCHAR2(30)

);

 

-- 2. 자료 입력

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (1, 'A', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (2, 'B', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (3, 'C', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (4, 'D', '');

INSERT INTO CASE_STUDY (PKEY, DATA1, DATA2) VALUES (5, 'E', '');

 

-- 3. 데이터 출력

SELECT

       PKEY,

    DECODE(PKEY, 1, DATA1,

        DECODE(PKEY, 2, DATA2,

          DECODE(PKEY, 3, DATA1,

          DATA2)

         )

       ) AS DATA

FROM

       CASE_STUDY

   

 -- 또는

 SELECT

       PKEY,

    DECODE(PKEY, 1, DATA1,

          2, DATA2,

          3, DATA1,

          DATA2) AS DATA

FROM

       CASE_STUDY

   

 

-- 4. 결과

1      A      -- 1 DATA1

2           -- 2 DATA2

3      C      -- 3 DATA1

4           -- 아니면 DATA2

5           -- 아니면 DATA2

 

è  Oracle 8.1.7부터는 MSSQL과 거의 동일한 CASE문을 제공합니다.

위 구문을 MSSQL 구문과 동일하게 하셔도 결과는 같습니다.

 

 

20.   지금(Right Now) 가져오기

구분

MSSQL

Oracle

함수

GETDATE()

SYSDATE

용례

SELECT GETDATE()

SELECT SYSDATE FROM DUAL;

결과

2010-11-07 11:50:08.700

2010/11/07 11:50:09

 

è  MSSQL 2008에서는 SYSDATETIME()을 통해서 더 상세하게 사용이 가능합니다.(DATETIME2)

SELECT SYSDATETIME()

-- 결과

2010-11-07 11:52:25.9900000

 

 

21.   일자 더하기 / 빼기

구분

MSSQL

Oracle

함수

DATEADD

+ / -

용례

SELECT GETDATE();

SELECT DATEADD(d,1,GETDATE());

SELECT DATEADD(hh,5,DATEADD(d,1,GETDATE()));

SELECT DATEADD(d,-1,GETDATE());

SELECT SYSDATE FROM DUAL;

SELECT SYSDATE + 1 FROM DUAL;

SELECT SYSDATE + 1.5 FROM DUAL;

결과

2010-11-07 11:57:38.140

2010-11-08 11:57:38.140

2010-11-08 16:57:38.140

2010-11-06 11:57:38.140

2010/11/07 11:58:09

2010/11/08 11:58:09

2010/11/08 23:58:09
2010/11/06 11:58:09

è  위 결과를 보시면 아시겠지만, Oracle에서는 소수점 단위로 일자계산이 가능합니다. MSSQL에서는 일자에 소수점을 사용해도 인식이 불가능합니다.

 

 

22.   일자 차이 계산

구분

MSSQL

Oracle

함수

DATEDIFF

+ / -

용례

SELECT DATEDIFF(dd,'2010/10/07',GETDATE())

SELECT SYSDATE - TO_DATE('2010/10/07') FROM DUAL;

결과

31

31.39103009259259259259259259259259259259

è  위 결과에도 나타나듯이, MSSQL에서는 일자로 지정하면 딱 떨어지지만, Oracle에서는 특별히 지정하지 않는 한 소수점까지 나타냅니다.

 

 

23.   해당 월의 마지막 날 가져오기

구분

MSSQL

Oracle

함수

지원하지 않음

LAST_DAY

용례

-

SELECT LAST_DAY(to_date('2010/11/15', 'yyyy/mm/dd')) FROM DUAL;

결과

-

2010/11/30 00:00:00

è  MSSQL에서는 아래와 같이 처리할 수 있습니다.

SELECT DATEADD(d,-1,CONVERT(DATETIME,CONVERT(CHAR(6),DATEADD(m,1,'2010-11-15'),112) + '01'))

-- 설명 : 해당일에 1개월을 더한 , 달의 1일에서 하루를 날을 가져옵니다.

-- 결과

2010-11-30 00:00:00.000

 

 

24.   Time Zone에 의한 시간 변환

구분

MSSQL

Oracle

함수

지원하지 않음

NEW_TIME

용례

-

SELECT NEW_TIME (TO_DATE ('2010/11/07 13:45', 'yyyy/mm/dd HH24:MI'), 'AST', 'MST') FROM DUAL;

결과

-

2010/11/07 10:45:00

è  AST : 대서양 표준시(캐나다 동부, 푸에르토리고, 버진아일랜드 등, 그리니치 표준시보다 4시간 늦음)
MST :
산악 표준시(로키 산맥에 가까운 미국과 캐나다 일부 지역의 동계 표준시, 그리니치 표준시보다 7시간 늦음)

è  Oracle Zone

Value

Description

AST

Atlantic Standard Time

ADT

Atlantic Daylight Time

BST

Bering Standard Time

BDT

Bering Daylight Time

CST

Central Standard Time

CDT

Central Daylight Time

EST

Eastern Standard Time

EDT

Eastern Daylight Time

GMT

Greenwich Mean Time

HST

Alaska-Hawaii Standard Time

HDT

Alaska-Hawaii Daylight Time

MST

Mountain Standard Time

MDT

Mountain Daylight Time

NST

Newfoundland Standard Time

PST

Pacific Standard Time

PDT

Pacific Daylight Time

YST

Yukon Standard Time

YDT

Yukon Daylight Time

 

è  MSSQL DATETIMEOFFSET이라는 것이 있지만, 이것은 표준시간대 인식일 뿐 구조는 다릅니다.

 

 

25.   해당일자 다음에 오는 해당 요일 반환

구분

MSSQL

Oracle

함수

지원하지 않음

NEXT_DAY

용례

-

SELECT NEXT_DAY('2010/11/07', '월요일') FROM DUAL;

결과

-

2010/11/08 00:00:00

è  보시다시피 2010 11 7일 이후에 처음 오는 월요일을 반환합니다.
하지만, 주의할 사항은 국가설정에 따라 일자설정이 다릅니다
.
미국으로 되어 있으면 SELECT NEXT_DAY('10-Nov-07', 'MONDAY') FROM DUAL; 으로 하셔야 합니다.

 

 

26.   지정한 날짜의 특정 부분을 나타내는 문자열을 반환합니다.

구분

MSSQL

Oracle

함수

DATENAME, DATEPART …

TO_CHAR

용례

SELECT DATENAME(day, '2010-11-07')

SELECT DATENAME(month, '2010-11-07')

SELECT DATENAME(year, '2010-11-07')

 

SELECT DATEPART(day,'2010-11-07')

SELECT DAY('2010-11-07')

SELECT TO_CHAR(TO_DATE('2010/11/07'), 'DD') FROM DUAL;

SELECT TO_CHAR(TO_DATE('2010/11/07'), 'MM') FROM DUAL;

SELECT TO_CHAR(TO_DATE('2010/11/07'), 'YYYY') FROM DUAL;

결과

7

11

2010

 

7

7

07

11

2010

è  MSSQL DATENAME의 경우 2005 이전 버전에 맞춰져 있습니다. 그 이상의 버전에서는 용례 아랫부분을 참조하시면 됩니다.
Oracle
의 경우엔 TO_CHAR를 만능으로 써서 할 수 있습니다.

다만 실제로 숫자처럼 쓰시려면 TO_NUMBER를 통해서 숫자형으로 변환해 주셔야 합니다.

 

 

27.   문자형을 날짜형으로 변환

구분

MSSQL

Oracle

함수

CONVERT / CAST

TO_DATE

용례

SELECT CONVERT(DATETIME,'2010-11-07')

SELECT CONVERT(DATETIME,'2010-11-07 12:20:23')

SELECT CONVERT(DATETIME,'20101107')

SELECT CONVERT(DATETIME,'20101107 12:20:23')

 

SELECT CAST('20101107 12:20:23' AS DATETIME)

SELECT TO_DATE('2010-11-07') FROM DUAL;

SELECT TO_DATE('2010/11/07 12:20:23', 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;

SELECT TO_DATE('20101107','YYYYMMDD') FROM DUAL;

SELECT TO_DATE('11/07/2010','MM/DD/YYYY') FROM DUAL;

결과

2010-11-07 00:00:00.000

2010-11-07 12:20:23.000

2010-11-07 00:00:00.000

2010-11-07 12:20:23.000

 

2010-11-07 12:20:23.000

2010/11/07 00:00:00

2010/11/07 12:20:23

2010/11/07 00:00:00

2010/11/07 00:00:00

è  Oracle의 경우엔 Format_Mask를 지정해 주시는 것이 관례입니다.

 

 

28.   날짜형을 문자형으로 변환

구분

MSSQL

Oracle

함수

CONVERT / CAST

TO_CHAR

용례

SELECT CONVERT(CHAR(8),GETDATE(),112)

SELECT CONVERT(CHAR(10),GETDATE(),120)

SELECT CONVERT(CHAR(20),GETDATE(),120)

SELECT CONVERT(CHAR(20),GETDATE())

 

SELECT CAST(GETDATE() AS CHAR(20))

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL;

SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') FROM DUAL;

SELECT TO_CHAR(SYSDATE,'MM/DD/YYYY') FROM DUAL;

결과

20101107

2010-11-07

2010-11-07 17:41:21

11  7 2010  5:42PM

 

11  7 2010  5:41PM

2010-11-07 17:43:53

20101107

11/07/2010

è  문자형과 날짜형 변환은 위처럼 사용이 가능한데요,

MSSQL에서의 자세한 사항은 강산아님의 아티클

(http://www.sqler.com/?mid=bColumn&page=4&document_srl=265068)

을 참조해 주세요.

 

 

'plming > DB' 카테고리의 다른 글

iBatis 문자열 파라미터 비교  (0) 2015.07.03
MSSQL - CONVERT 스타일 별 결과 값  (0) 2015.05.12
MSSQL과 Oracle 함수 비교  (0) 2015.05.12
MSSQL - NEWID  (0) 2015.05.12
MSSQL - ROWNUM  (0) 2015.05.12
[Oracle] Milisecond 가져오기  (0) 2012.02.14
날짜 시간을 문자열로 만들 때 흔히
이렇게 사용했다.

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
FROM DUAL;


하지만, 흔히 100분의 1초라는 Milisecond는
SYSDATE 만으로는 해결되지 않는다.
이늠은 TIMESTAMP에서 확인해야한다.

SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF6')
FROM DUAL;

'plming > DB' 카테고리의 다른 글

MSSQL - NEWID  (0) 2015.05.12
MSSQL - ROWNUM  (0) 2015.05.12
[Oracle] Milisecond 가져오기  (0) 2012.02.14
[펌] Oracle RANK() OVER  (0) 2011.11.04
[펌] 오라클에서 not exists, not in, minus의 성능차이  (0) 2011.11.04
Oracle - Table Schema 조회  (0) 2011.07.15
디스크...조각모음? 인 듯하다.
기존의 Move 라는 것과 비교해서 OnLine 상태에서 처리가 가능하며,
행(Record) 단위로 처리를 하므로 부화가 적단다.

실제 점유하고 있는 디스크를...
Shrlink 기능을 사용하여 재 정렬시킴으로써,
사용가능한 용량으로 환원해주는 듯한...

SELECT * FROM TABLE( DBMS_SPACE.ASA_RECOMMNDATIONS() );
※ DBMS_SPACE를 접근하기 위해서도 권한이 있어야 하나보다...;;;

위 명령을 사용해서 전체점유율, 실제사용량, 반납가능량의 크기를 확인할 수 있다.
(조금 더 연구(?)를 해봐야하지만...실제로 Shrlink를 통한 반납/실 점유용량은 같지 않은 듯 하다...ㅡㅡ;;;)

Shrlink 실행 전 전체 용량과 실 점유 용량을 확인해보고...,
Shrlink를 실행 후 전체 용량을 확인해보면...
예상되는 결과로는...

실행 전 실 점유 용량과
실행 후 전체 용량(실 점유 용량)이 같아야 할 것 같은데...;;;
일치하지 않는다...ㅡㅡ;;;


점유 용량을 확인하는 더욱 정확한 방법을 찾아보고...
Shrlink를 TEST를 해볼 필요가 있을 듯 하다...;;;


위 TEST의 진위 여부를 확인할 수 있는 Case를 아시는 분은...
과감히 공개해주시기를 바란다.

DBA_SEGMENTS를 이용하면...뭔가가 더욱 정확해지려나...?  쩝...;;;

다시 연구하러...총총총...=3=3=3=3=3

'plming > DB' 카테고리의 다른 글

Firebird DB등록 시 Error  (0) 2010.01.08
Firebird Backup/Restore  (0) 2010.01.08
TRUNC(), ROUND() Format  (0) 2009.05.15
Oracle Segment Shrlink  (3) 2009.04.13
Oracle Language 설정 & Tomcat에서의 개발  (2) 2009.04.06
java.sql.SQLException: Invalid column index  (0) 2009.03.13
  1. 행이™ 2009.04.14 16:50 신고

    http://blog.daum.net/sagedata/8938094

  2. 행이™ 2009.04.14 16:51 신고

    http://pinetree.pe.kr/367

  3. 행이™ 2009.04.14 17:19 신고

    http://cafe361.daum.net/_c21_/bbs_search_read?grpid=1Dlom&fldid=2tKj&contentval=00007zzzzzzzzzzzzzzzzzzzzzzzzz&nenc=&fenc=&q=dbms_space&nil_profile=cafetop&nil_menu=sch_updw

+ Recent posts