[ DB2.일반함수 - 일자.시간.분_함수 ]
1. 현재 년/월/일/시간/분/초 개별로구하기
연도 - sql 문장 : SELECT YEAR (current timestamp) FROM sysibm.sysdummy1
월 - sql 문장 : SELECT MONTH (current timestamp) FROM sysibm.sysdummy1
일자 - sql 문장 : SELECT DAY (current timestamp) FROM sysibm.sysdummy1
시간 - sql 문장 : SELECT HOUR(current timestamp) FROM sysibm.sysdummy1
분 - sql 문장 : SELECT MINUTE(current timestamp) FROM sysibm.sysdummy1
초 - sql 문장 : SELECT SECOND(current timestamp) FROM sysibm.sysdummy1
MICROSECOND - sql 문장 : SELECT MICROSECOND(current timestamp) FROM sysibm.sysdummy1
2. 현재 일자/시간:분:초/일자 시간:문:초 구하기
현재일자 : sql 문장 : SELECT current date FROM sysibm.sysdummy1
SELECT DATE (current timestamp) FROM sysibm.sysdummy1
결과 : 2007-08-03
현재 시간:분:초 : sql문장 : SELECT current time FROM sysibm.sysdummy1
SELECT TIME (current timestamp) FROM sysibm.sysdummy1
결과 : 20:55:36
현재 일자 시간:분:초 : sql문장 : SELECT current timestamp FROM sysibm.sysdummy1
결과 : 2007-02-14 20:56:08.217776
참고 : sysibm.sysdummy1 테이블은 DB2 레지스터의 값을 찾는데 사용할 수 있는 특별한 인메모리(in-memory) 테이블이다.
999. SQL 날짜와 시간 함수
DAYNAME 인자에 요일 이름(예, 금요일)이 포함된 혼합 문자열을 리턴.
DAYOFWEEK 1에서 7까지 정수 값으로 요일을 나타낸다. 여기에서 1은 일요일을 의미한다.
DAYOFWEEK_ISO 1에서 7까지 정수 값으로 요일을 나타낸다. 여기에서 1은 월요일이다.
DAYOFYEAR 1에서 366 까지의 정수로 날(day)을 리턴.
DAYS 날짜를 정수로 리턴.
JULIAN_DAY January 1, 4712 B.C. (Julian 달력의 시작)부터 인자에 지정된 날짜 값까지 정수로 날수를 나타냄.
MIDNIGHT_SECONDS 0에서 86400 까지의 정수 값으로 자정(midnight)과 인자에서 지정된 시간 값 사이의 초의 값을 나타냄.
MONTHNAME 달의 이름(예를 들어, January)을 포함하고 있는 혼합 문자열 리턴.
TIMESTAMP_ISO 날짜, 시간, 타임스탬프 인자에 기반한 타임스탬프 값을 리턴.
TIMESTAMP_FORMAT 문자 템플릿을 사용하여 인터프리팅 된 문자열에서 타임스탬프를 리턴.
TIMESTAMPDIFF 두 타임스탬프들 간 차이에 기반하여, 첫 번째 인자에서 정의된 유형의 인터벌 수를 리턴.
TO_CHAR 문자 템플릿을 사용하여 포맷된 타임스탬프의 문자 구현을 리턴. TO_CHAR는 VARCHAR_FORMAT의 동의어이다.
TO_DATE 문자 템플릿을 사용하여 인터프리팅 된 문자열에서 타임스탬프를 리턴. TO_DATE는 TIMESTAMP_FORMAT의 동의어이다.
WEEK 1에서 54까지 정수 값으로 주(week)를 리턴함. 주는 Sunday로 시작한다.
WEEK_ISO 1에서 53까지 정수 값으로 주를 리턴함.
999. 날짜 포맷 변경
날짜에 사용되는 기본 포맷은 데이터베이스의 영역(territory) 코드로 결정된다.
(이것은 데이터베이스 생성 때 지정될 수 있다.) 예를 들어, 데이터베이스가
territory=US를 사용하여 만들어졌다면 날짜 포맷은 다음과 같을 것이다.
values current date
1
----------
05/30/2003
1 record(s) selected.
말하자면 이것은 MM/DD/YYYY 포맷이다.
이 포맷을 변경하려면 db2 유틸리티 패키지 컬렉션을 다른 날짜 포맷으로 바인딩한다.
999. 포맷 종류
DEF 영역 코드와 관련된 날짜 포맷과 시간 포맷을 사용.
EUR IBM 유럽 표준의 날짜와 시간 포맷을 사용함.
ISO International Standards Organization의 날짜와 시간 포맷을 사용.
JIS Japanese Industrial Standard의 포맷 사용.
LOC 해당 데이터베이스의 영역 코드와 관련된 로컬 형식의 날짜와 시간 포맷을 사용함.
USA IBM U.S. 표준을 사용함.
999. ISO (YYYY-MM-DD)로 디폴트 포맷을 변경하려면 다음과 같이 한다.
1.명령행에서, 현재 디렉토리를 sqllib\bnd로 변경한다.
예:
On Windows: c:\program files\IBM\sqllib\bnd
On UNIX: /home/db2inst1/sqllib/bnd
SYSADM 권한을 가진 사용자로서 OS 쉘에서 데이터베이스로 연결한다.
db2 connect to DBNAME
db2 bind @db2ubind.lst datetime ISO blocking all grant publ
999. DB2가 로컬 포맷으로 날짜를 나타내는 방식을 어떻게 변경하는지를 설명하였다.
하지만 'yyyymmdd'처럼 커스텀 포맷으로 하고싶다면? 최선의 방법은 커스텀 포맷팅 함수를 다시 작성하는 것이다.
UDF:
create function ts_fmt(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as
(
select substr( digits (day(TS)),9),
substr( digits (month(TS)),9) ,
rtrim(char(year(TS))) ,
substr( digits (hour(TS)),9),
substr( digits (minute(TS)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select case fmt
when 'yyyymmdd' then yyyy || mm || dd
when 'mm/dd/yyyy' then mm || '/' || dd || '/' || yyyy
when 'yyyy/dd/mm hh:mi:ss' then yyyy || '/' || mm || '/' || dd || ' ' || hh || ':' || mi || ':' || ss
when 'nnnnnn' then nnnnnn
else 'date format ' || coalesce(fmt,' <null> ') || ' not recognized.'
end
from tmp
</null>
이 함수 코드는 복잡해보인다. 하지만 자세히 살펴보면 매우 단순하면서도 좋은 코드임을 알 수 있다.
우선, common table expression (CTE)를 사용하여 타임스탬프(첫 번째 입력 매개변수)를 개별 컴포넌트에서 분리한다.
그런 다음, 제공된 포맷(두 번째 입력 매개변수)을 검사하고 요청된 포맷과 부분을 사용하여 타임스탬프를 다시 정렬한다.
이 함수는 매우 유연하다. 또 다른 패턴을 추가하려면 원하는 포맷과 함께 WHEN 구문을 붙이면 된다.
예상하지 못했던 패턴이 나타났다면 에러메시지가 리턴된 것이다.
사용 예제:
values ts_fmt(current timestamp,'yyyymmdd')
'20030818'
values ts_fmt(current timestamp,'asa')
'date format asa not recognized.'
'(DB) DB2 > 일반함수' 카테고리의 다른 글
DB2.일반함수 - 비교.판단_함수 (0) | 2017.01.27 |
---|---|
DB2.일반함수 - 문자_함수 (0) | 2017.01.27 |
DB2.일반함수 - 문자_함수 (0) | 2017.01.27 |