[ DB2.일반함수 - 문자_함수 ]
1. 특정일자에 년수 더하기
1.1 예제 1
: SELECT current date + 1 YEAR FROM sysibm.sysdummy1
-> YEAR를 사용하면 YEAR앞쪽의 숫자를 연도로 변환시킨다.
1.2 예제 2
: arg : asDate : 문자형날짜
aiYear : 더하고 싶은 년수(숫자형)
: SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2)) + aiYear YEAR ),'-',''),1,8)
: 쪼개기 : 1. 날짜를 '-' formatting 한다 : (SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2))
2. 문자형날짜를 Date 형으로 변환 : (DATE( 1번결과 )
3. Date형에서 년수를 더한후 문자형으로 변환 : CHAR(2번결과 + aiYear YEAR )
4. '-'가 있는 문자형날짜를 '-'를 제거 : REPLACE(3번결과,'-','')
5. 문자형날짜에서 앞쪽 년월일만 취함 : SUBSTR(4번결과,1,8)
2. 특정일자에 월수 더하기
: arg : asDate : 문자형날짜
aiMonth : 더하고 싶은 월수(숫자형)
: SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2)) + aiMonth MONTH ),'-',''),1,8)
: 쪼개기 : 1. 날짜를 '-' formatting 한다 : (SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2))
2. 문자형날짜를 Date 형으로 변환 : (DATE( 1번결과 )
3. Date형에서 월수를 더한후 문자형으로 변환 : CHAR(2번결과 + aiMonth MONTH )
4. '-'가 있는 문자형날짜를 '-'를 제거 : REPLACE(3번결과,'-','')
5. 문자형날짜에서 앞쪽 년월일만 취함 : SUBSTR(4번결과,1,8)
3. 특정일자에 일수더하기
3.1 예제 1
: SELECT current date + 3 YEARS + 2 MONTHS + 15 DAYS FROM sysibm.sysdummy1
-> YEARS, MONTHS, DAYS를 사용하면 앞쪽 숫자를 년/월/일로 변환시킨다.
3.2 예제 2
: arg : asDate : 문자형날짜
aiDays : 더하고 싶은 일자(숫자형)
: SUBSTR(REPLACE(CHAR(DATE(SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2)) + aiDays DAYS ),'-',''),1,8)
: 쪼개기 : 1. 날짜를 '-' formatting 한다 : (SUBSTR(asDate,1,4) ||'-'|| SUBSTR(asDate,5,2) ||'-'|| SUBSTR(asDate,7,2))
2. 문자형날짜를 Date 형으로 변환 : (DATE( 1번결과 )
3. Date형에서 일수를 더한후 문자형으로 변환 : CHAR(2번결과 + aiDays DAYS )
4. '-'가 있는 문자형날짜를 '-'를 제거 : REPLACE(3번결과,'-','')
5. 문자형날짜에서 앞쪽 년월일만 취함 : SUBSTR(4번결과,1,8)
4. 시간:분:초 더하기
1. 예제 1
: SELECT current time + 5 HOURS - 3 MINUTES + 10 SECONDS FROM sysibm.sysdummy1
-> HOURS, MINUTES, SECONDS를 사용하면 앞쪽 숫자를 시간/분/초로 변환시킨다.
5. 두 날짜 사이의 간격구하기
1. 예제 1
: SELECT days (current date) - days (date('1999-10-22')) FROM sysibm.sysdummy1
801. 날짜를 문자로 변환하기
1. 예제 1
: char(current date)
char(current time)
char(current date + 12 hours)
802. 문자열을 날짜로 변환하기
1. 예제 1
: TIMESTAMP ('2002-10-20-12.00.00.000000')
TIMESTAMP ('2002-10-20 12:00:00')
DATE ('2002-10-20')
DATE ('10/20/2002')
TIME ('12:00:00')
TIME ('12.00.00')
999. 잡다한거
1. 다음은 마이크로초 부분을 0으로 재설정하고 현재 타임스탬프를 얻는 방법이다
CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS
2. TIMESTAMP(), DATE(), TIME() 함수는 여러 포맷들을 허용한다.
3. DATE 함수에서 쿼트를 없애면 어떻게 될까? 함수는 여전히 작동하겠지만 정확하지 않은 DATE가 나올 것이다.
- SELECT DATE(2001-09-22) FROM SYSIBM.SYSDUMMY1;
- 결과 : 05/24/0006
- 이유 : 위 결과에서 어떻게 2000년 이나 차이가 났을까? DATE 함수가 입력으로 문자열을 취하면 DB2 날짜의 유효 문자로 간주되고,
따라서 이를 변환하는 것이다. 반대로, 입력이 숫자라면 이 함수는 현재 년도(0001-01-01)에서 1을 제한 날 수를 나타내는 것으로 간주한다.
위 쿼리에서 입력은 2001-09-22였고 이것은 (2001-9)-22과 동일하다. 또한 이것은 1970이다.
4. 가끔씩, 두 개의 타임스탬프들이 어떻게 차이가 있는지 알아야 한다.
이를 위해 DB2는 TIMESTAMPDIFF()라고 하는 빌트인 함수를 제공한다. 하지만 리턴된 값은 근사값이다.
윤년을 고려하지 않고 한 달을 30일로만 가정하기 때문이다. 다음은 두 날짜들 간 차이를 찾아내는 방법이다.
- timestampdiff (<n>, char( timestamp('2002-11-30-00.00.00')- timestamp('2002-11-08-00.00.00')))
<n>의 자리에, 다음 값들을 사용하여 시간 단위를 나타낸다.
1 = 초의 소수부분
2 = 초
4 = 분
8 = 시간
16 = 요일
32 = 주
64 = 달
128 = 분기
256 = 년
timestampdiff()를 사용하면 날짜가 비교적 가까이 있을 때 더 정확한 결과가 나온다.
보다 정확한 계산을 원하면 다음을 사용하여 시간 단위로(초 단위로) 차이를 결정한다.