안녕하세요?
지난 번에 이어 마지막으로 세 번째 Function 비교 시간입니다.
MSSQL 2005, Oracle 9i 기준입니다.
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 |
è 위 결과를 보시면 아시겠지만, 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 표
|
è 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)
을 참조해 주세요.
일단, Oracle 과 MSSQL 함수 비교는 여기서 마칠까 합니다.
물론, MSSQL 2008과 Oracle 10g/11g 로 올라가면서 추가되거나 변경된 것들도 많은데요, 제가 조금 더 공부해서 알려드리도록 하겠습니다.
이상 [쓸만한게없네]였습니다.
출처 : http://www.sqler.com/316811